为什么我的Flatten着色器(来自Lighthouse3d教程)不起作用?

Ein*_*rus 1 c++ opengl shader glut glsl

我是GLSL的新手.所以,我正在浏览网上的教程.

本教程有一个名为Flatten Shader的示例,它将GLUT茶壶显示为展平的茶壶.这是Flatten Shader的链接.

我完成了与教程中提到的步骤完全相同的所有操作,但我的茶壶并不像教程中的茶壶那样平坦.它看起来像一个普通的茶壶.

以下是顶点着色器的代码:

  void main()
  {
     vec4 v = vec4(gl_Vertex);
     v.z = 0.0;
     gl_Position = gl_ModelViewProjectionMatrix * v;
  }
Run Code Online (Sandbox Code Playgroud)

这是我的片段着色器:

 void main()
 {
    gl_FragColor = gl_Color;
 }
Run Code Online (Sandbox Code Playgroud)

以下是我绘制茶壶的方法:

 void display ( void )
{   
    glClearDepth(1.0);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glMatrixMode( GL_MODELVIEW );

    glLoadIdentity();

    gluLookAt( 0.0, 0.0, 2.0,
           0.0, 0.0, 0.0,
           0.0, 1.0, 0.0
             );

    glMultMatrixd(trackball->getRotation());

    const GLfloat diffuseIntensity[] = { 0.8, 0.4, 0.4, 1.0 };
    const GLfloat specularIntensity[] = { 0.5, 0.5, 0.5, 1.0 };

    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, diffuseIntensity);
    glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specularIntensity);
    glMaterialf( GL_FRONT_AND_BACK, GL_SHININESS, 5.0 );

    glutSolidTeapot(1.0);

    glutSwapBuffers();
}
Run Code Online (Sandbox Code Playgroud)

虽然它应该是"平坦的",但显示的茶壶就像一个普通的茶壶.如果您认为我错过了一些初始配置/设置步骤,那么请不要因为我已经这样做了:

GLuint createShader ( const GLchar* const source, GLenum type )
{
     GLuint shader = glCreateShader( type );
     glShaderSource( shader, 1, const_cast<const GLchar**>(&source), 0 );
     glCompileShader( shader );

     return shader;
}
Run Code Online (Sandbox Code Playgroud)

和:

GLuint createProgram ( const GLuint shader )
{
     GLuint program = glCreateProgram();
     glAttachShader(program, shader);
     glLinkProgram(program);

     return program;
}
Run Code Online (Sandbox Code Playgroud)

这里是一切都聚集在一起的地方:

    GLuint vertexShader = createShader(vertexShaderSource, GL_VERTEX_SHADER);
    GLuint fragmentShader = createShader(fragmentShaderSource, GL_FRAGMENT_SHADER);

    GLuint vertexShaderProgram = createProgram(vertexShader);
    GLuint fragmentShaderProgram = createProgram(fragmentShader);

    glUseProgram(vertexShaderProgram);
    glUseProgram(fragmentShaderProgram);
Run Code Online (Sandbox Code Playgroud)

我不知道出了什么问题.请帮忙!

Mik*_*ola 5

一些东西:

  1. 您没有正确绑定着色器.您的createProgram函数需要将片段着色器和顶点着色器绑定在一起.您应该使用如下代码替换它:

    GLuint createProgram ( const GLuint fshader, const GLuint vshader )
    {
         GLuint program = glCreateProgram();
         glAttachShader(program, fshader);
         glAttachShader(program, vshader);       
         glLinkProgram(program);
         return program;
    
    Run Code Online (Sandbox Code Playgroud)

    }

  2. 相应地,您应该将上一个代码段修改为如下所示:

    GLuint vertexShader = createShader(vertexShaderSource, GL_VERTEX_SHADER);
    GLuint fragmentShader = createShader(fragmentShaderSource, GL_FRAGMENT_SHADER);
    GLuint shaderProgram = createProgram(fragmentShader, vertexShader);
    glUseProgram(shaderProgram);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 此外,还可能存在其他问题.您应该使用glGet(Shader | Program)InfoLog来帮助调试着色器,并调用glGetError来帮助诊断程序失败的位置.

  4. 最后,我不能保证这个堆栈交换答案的可信度,但显然在一些较旧的ATi实现中gl_Color是vec3,而不是vec4,因此你需要在分配之前进行转换.请参阅以下讨论: GLSL片段着色器语法错误