绘制三角形,不能正常设置

时间:2012-10-28 18:23:44

标签: c++ opengl

我是一位经验丰富的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; "
                               "}";

1 个答案:

答案 0 :(得分:3)

剔除不是基于法线的方向,而是基于绕线顺序。尝试切换绘制顶点的方向,看看是否有所不同。要更改绕线顺序,您可以glFrontFace使用GL_CWGL_CCW,它定义哪个面朝前,哪个面朝后。