UP | HOME

����ʵ������

Table of Contents

1 ����ʵ������

1.1 ����

CANNOT INCLUDE FILE ./program/opengl/Src/Chapter03/GeoTest/GeoTest.cpp

1.2 ���

./images/opengl_fig05.png

һЩijЩԶ�������λ����ڽ���������֮�ϵĶ���

1.3 ����

�������˵�������3D�����һЩ����ڴ������Ҽ��������������һ�� Effects �˵������������û����һЩ3D��ͼ���ܡ�

2 ����ͱ����޳�

  • ���ã������Ѿ�֪���϶����ᱻ���Ƶļ���ͼ�Σ��Ի��������������ߡ�

    һ������޳������·�ʽ������

    glEnable(GL_CULL_FACE);
    

    ��Ӧ�ģ��������·�ʽ�رա�

    glDisable(GL_CULL_FACE);
    

    ��ע�⣬���Dz�û��ָ���޳��������滹�DZ��档����������һ������ glCullFace ���Ƶġ�

    void glCullFace(GLenum mode);
    

    mode�IJ����Ŀ���ֵΪ GL_FRONT �� GL_Back �� GL_FRONT_AND_BACK ��������Ҫ������͸�������������ڲ�����ͼ�ξ���Ҫ���д��롣

    glCullFace(GL_BACK);
    glEnable(GL_CULL_FACE);    
    

./images/opengl_fig06.png

�����˱��������Σ��������ص��Ķ����ڲ�ʹ����Ȳ��Ե�����¿��ܳ�����

3 ��Ȳ���

  • ���ã�ʹzֵ�ϴ�����ص㿿���۲��ߣ�����zֵ��С�����ص�

���һ�����Ƶ�������������ǰ���Ƶ����������ǰ�棨�е�����ͼ�㣩��Ϊ�˰���Щ����ŵ����棬���ǿ���ʹ��һ�ֳ�Ϊ ��Ȳ��� ��������������������

��Ȳ�����һ����Ч���������ر��������ļ��ɣ�OpenGL�ṩ��һЩ������������Ļ���������������ĸ���dz��򵥣���һ�����ر�����ʱ������������һ��ֵ����Ϊzֵ�����Ա�ʾ���͹۲���֮��ľ��롣�Ժ󣬵������ĻΪֻ��Ҫ������һ������ʱ�������ص�zֵ�ͻ���ԭ���Ѿ��洢���Ǹ����ؽ��бȽϡ���������ص�zֵ���ߣ����͸������۲��ߣ����λ����ǰ�Ǹ����ص�ǰ�档����������λ��ԭ���Ǹ����صĺ��棬�Ҳ�����סǰ����Ǹ����ء����ڲ������������ͨ����Ȼ�����ʵ�ֵģ����洢����Ļ��ÿ�����ص����ֵ��

������ʹ��GLUT����OpenGL���ڵ�ʱ��Ӧ������һ����Ȼ����������磬���ǿ��԰������·�ʽ����һ����ɫ��������һ����Ȼ�������

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);

Ϊ��������Ȳ��ԣ�ֻҪ�򵥵ĵ���

glEnable(GL_DEPTH_TEST);

./images/opengl_fig07.png

ʹ����Ȳ���

4 �����ģʽ

void glPolygonMode(GLenum face, GLenum mode);
  • face ��ȡֵ�����ǿ��ԶԶ���ε����棨 GL_FRONT_AND_BACK ����Ӧ�������Ⱦģʽ��Ҳ����ֻ�Զ���ε����棨 GL_FRONT �����棨 GL_BACK ��Ӧ�����ģʽ��
  • mode ��ȡֵ����Ĭ������£�����α����Ƴ�ʵ�ģ� GL_FILL ���ġ����ǣ�Ҳ���Ըı������Ϊ��ָ��ֻ���ƶ���ε���� GL_LINE ��������ֻ���Ƶ㣨 GL_POINT ���� glPolygonMode ���������������Ϊʵ��ͼ�Ρ������ߵ������Ⱦ��

./images/opengl_fig08.png

ʹ�� glPolygonMode �Ѷ���ε�����ͱ�����Ϊ�߿�ģʽ

./images/opengl_fig09.png

ʹ�� glPolygonMode �Ѷ���ε�����ͱ�����Ϊ����ģʽ

5 �����ƫ��

��Ȼ��Ȳ����ܹ�ʵ����ʵ�Ӿ���������ܣ�����ʱ��������Ҫ��΢����ƭ��һ�¡������������������Ҫ����������ͼ�λ��Ƶ�ͬһ���ʱ������������� z-fighting ��z��ͻ�����⡣

glPolygonOffset ����ʹ���ǿ��Ե���Ƭ�ε����ֵ���������� ʹ���ֵ����ƫ�� ������ʵ�ʸı�3D�ռ��е�����λ�á�

void glPolygonOffset(GLfloat factor, GLfloat units);

Ӧ�õ�Ƭ���ϵ���ƫ�ƿ���������ķ���ʽ����ʾ��

\[ \mbox{Depth Offset} = (\mbox{DZ} \times \mbox{factor}) + (r \times \mbox{units}) \]

���� \(\mbox{DZ}\) �����ֵ��zֵ������ڶ������Ļ����ı仯������r����ʹ��Ȼ�����ֵ�����仯����Сֵ����û��һ��Ӳ�Թ涨�ܹ��ҵ�һ������һʧ��ֵ�����Ǿ������õ�ʱ�򻹿�����Ҫ����һ�¡�

��ֵ��ʹzֵ�������Ǹ���������ֵ��Ὣ�����ƶ��ø�Զ������Primitivesʾ��������˵�����ǽ�factor��units������ֵ������Ϊ-1.0��

����ʹ�� glPolygonOffset ����ƫ��ֵ֮�⣬���������ö���ε���ƫ������伸��ͼ�Σ� GL_POLYGON_OFFSET_FILL �����ߣ� GL_POLYGON_OFFSET_LINE ���͵㣨 GL_POLYGON_OFFSET_POINT ��������Ĵ�����ʾ��Primitivesʾ�������е�һ���������������������һ����ɫ�ļ���ͼ�Σ�����������������ǵĺ�ɫ�߿���ע�⣬����Ϊ��ʹ��ʾЧ�����ã���������ʹ���˸��ֵĿ�����ߡ��ڽ�������������������У����ǽ���һ�����ۿ���ݡ�

/////////////////////////////////////////////////////////////////////////
void DrawWireFramedBatch(GLBatch* pBatch)
{
  // Draw the batch solid green
  shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vGreen);
  pBatch->Draw();

  // Draw black outline
  glPolygonOffset(-1.0f, -1.0f);      // Shift depth values
  glEnable(GL_POLYGON_OFFSET_LINE);

  // Draw lines antialiased
  glEnable(GL_LINE_SMOOTH);
  glEnable(GL_BLEND);
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

  // Draw black wireframe version of geometry
  glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  glLineWidth(2.5f);
  shaderManager.UseStockShader(GLT_SHADER_FLAT, transformPipeline.GetModelViewProjectionMatrix(), vBlack);
  pBatch->Draw();

  // Put everything back the way we found it
  glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  glDisable(GL_POLYGON_OFFSET_LINE);
  glLineWidth(1.0f);
  glDisable(GL_BLEND);
  glDisable(GL_LINE_SMOOTH);
}

6 �ü������вü�

��һ�������Ⱦ���ܵķ�����ֻ����Ļ�Ͻ������޸ĵIJ��ֽ��и��¡����ǻ�������Ҫ��OpenGL ����Ⱦ���������ڴ����ڲ�һ���С�ľ��������� ��OpenGL�����ڴ�����ָ��һ���ü����Σ�����Ⱦֻ����������ڽ��С���Ĭ������£��ü����ξ��Ǵ��ڵĴ�С��������вü����ԡ����ǿ���ʹ���������glEnable�������򿪲ü����ԡ�

glEnable(GL_SCISSOR_TEST);

�����ڲ�ִ����Ⱦ���Ǹ������Ϊ�ü���scissor box�� ��������������������Դ������꣨���أ�����ʽָ���ġ�

void glScissor(GLint x, GLint y, GLsizei width, GLsizei height);

x��y����ָ���˲ü�������½ǣ�width��height������ֱ�ָ���˲ü���Ŀ��Ⱥ͸߶ȡ�����ij�����ʾ��ʾ������SCISSOR����Ⱦ���롣������������3����ɫ��������ÿ�������֮ǰ��ָ��һ����С�IJü���������һ���ص�����ɫģ�͡�

6.1 ʾ������

CANNOT INCLUDE FILE ./program/opengl/Src/Chapter03/Scissor/Scissor.cpp

Date: 2012-10-18 14:49:11 CST

Author: Joseph Pan

Validate XHTML 1.0