我是一位经验丰富的C ++程序员,他们正在努力学习OpenGL。其中,我正在阅读Richard Wright的 OpenGL超级圣经。支持库有黑客头C,松散地翻译成C ++。作为一个纯粹主义者,我已将大部分支持代码翻译成C ++。我在QT而不是Glut工作。我已经从第2章和第3章中的“原语”示例中获得了示例,但无法使“GeoTest”示例正常工作。以下是该问题的简化示例:
void geotest::paintGL() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_CULL_FACE);
model_view_matrix.push(view_frame);
float red[] = { 1.0f, 0.0f, 0.0f, 1.0f };
shader.use(
transform_pipeline.get_model_view_matrix(),
transform_pipeline.get_projection_matrix(),
red);
glBegin(GL_TRIANGLES);
glVertex3f(-1.2f, -1.2f, 0.0f);
glVertex3f( 1.2f, -1.2f, 0.0f);
glVertex3f( 1.2f, 1.2f, 0.0f);
glEnd();
model_view_matrix.pop();
}
shader
是我对该书GLT_SHADER_DEFAULT_LIGHT
的改编。我已经减少了图纸以隔离问题。当我运行此代码时,我得到一个看似空白的窗口。我没有显示的代码支持旋转图像,当我围绕x轴或y轴旋转180度时,我看到三角形的另一边,但它是黑色而不是红色。因此,看起来表面法线最初指向观察者,因此它会被剔除。
我尝试在glNormal3f(0.0f, 0.0f, -1.0f)
和1.0f
来电之间的任何地方添加1到3个glBegin
(和glEnd
)来电,但不影响我能看到;三角形总是以背面显示来绘制。
我错过了关于法医的基本原理吗?我很确定着色器是可以的(如果我使用本书的GLT_SHADER_FLAT,我会遇到与法线相同的问题,尽管当三角形出现时它是红色的,应该是这样)。
编辑这里是着色器的代码:
const char *default_light_vp = "uniform mat4 mvMatrix;"
"uniform mat4 pMatrix;"
"varying vec4 vFragColor;"
"attribute vec4 vVertex;"
"attribute vec3 vNormal;"
"uniform vec4 vColor;"
"void main(void) { "
" mat3 mNormalMatrix;"
" mNormalMatrix[0] = mvMatrix[0].xyz;"
" mNormalMatrix[1] = mvMatrix[1].xyz;"
" mNormalMatrix[2] = mvMatrix[2].xyz;"
" vec3 vNorm = normalize(mNormalMatrix * vNormal);"
" vec3 vLightDir = vec3(0.0, 0.0, 1.0); "
" float fDot = max(0.0, dot(vNorm, vLightDir)); "
" vFragColor.rgb = vColor.rgb * fDot;"
" vFragColor.a = vColor.a;"
" mat4 mvpMatrix;"
" mvpMatrix = pMatrix * mvMatrix;"
" gl_Position = mvpMatrix * vVertex; "
"}";
const char *default_light_fp =
#ifdef OPENGL_ES
"precision mediump float;"
#endif
"varying vec4 vFragColor; "
"void main(void) { "
" gl_FragColor = vFragColor; "
"}";
答案 0 :(得分:3)
剔除不是基于法线的方向,而是基于绕线顺序。尝试切换绘制顶点的方向,看看是否有所不同。要更改绕线顺序,您可以glFrontFace
使用GL_CW
和GL_CCW
,它定义哪个面朝前,哪个面朝后。