gpt4 book ai didi

c++ - 为什么我的 Flatten Shader(来自 Lighthouse3d 教程)不工作?

转载 作者:行者123 更新时间:2023-11-30 01:29:08 26 4
gpt4 key购买 nike

tutorial有一个名为 Flatten Shader 的示例,它将 GLUT 茶壶显示为扁平茶壶。 Here is the link to the Flatten Shader .

我完全按照教程中提到的步骤完成了所有操作,但我的茶壶并不像教程中的茶壶那样平整。它看起来就像一个普通的茶壶。

这是顶点着色器的代码:

  void main()
{
vec4 v = vec4(gl_Vertex);
v.z = 0.0;
gl_Position = gl_ModelViewProjectionMatrix * v;
}

这是我的片段着色器:

 void main()
{
gl_FragColor = gl_Color;
}

这是我画茶壶的方法:

 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();
}

虽然它应该是“扁平的”,但显示的茶壶就像一个普通的茶壶。如果您认为我错过了一些初始配置/设置步骤,请不要因为我已经完成了:

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;
}

和:

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

return program;
}

这里是所有东西聚集在一起的地方:

    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);

我哪里错了?

最佳答案

一些事情:

  1. 您没有正确绑定(bind)着色器。您的 createProgram 函数需要将片段着色器和顶点着色器绑定(bind)在一起。您应该将其替换为如下所示的代码:

    GLuint createProgram ( const GLuint fshader, const GLuint vshader )
    {
    GLuint program = glCreateProgram();
    glAttachShader(program, fshader);
    glAttachShader(program, vshader);
    glLinkProgram(program);
    return program;

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

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

  4. 最后,我不能保证这个堆栈交换答案的可信度,但显然在一些较旧的 ATi 实现中,gl_Color 是 vec3,而不是 vec4,因此您需要在分配之前对其进行强制转换。请参阅以下讨论:GLSL fragment shader syntax error

关于c++ - 为什么我的 Flatten Shader(来自 Lighthouse3d 教程)不工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6375423/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com