OpenGL 对象不显示,着色器相关

Posted

技术标签:

【中文标题】OpenGL 对象不显示,着色器相关【英文标题】:OpenGl object not displaying, shader related 【发布时间】:2013-10-22 10:40:51 【问题描述】:

我正在尝试使用着色器在 opengl 中渲染,生成背景颜色并且没有出现错误消息,但我尝试渲染的对象没有显示。我整天都在努力解决这个问题,但一无所获。我正在从.txt 文件中读取顶点和索引,但这似乎不是问题,因为所有数字都正是它们应该是的。这是我的 init

void init() 
    readFile("pendulum.txt", pVert, pIndices, pCols);

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable( GL_DEPTH_TEST );

    glClearColor(0.5,0.5,0.5,1.0);

    program = InitShader( "aVertexShader64.glsl", "aFragShader63.glsl" );
    glUseProgram( program );

    modelView = glGetUniformLocation( program, "model_view" );
    projection = glGetUniformLocation( program, "projection" );


    glGenVertexArrays( 1, &vao );
    glBindVertexArray( vao );

    // Create and initialize two buffer objects
    glGenBuffers( 2, buffers);

    //one buffer for the vertexPositions and colours
    glBindBuffer( GL_ARRAY_BUFFER, buffers[0]);
    glBufferData( GL_ARRAY_BUFFER, numVertexPositionBytes + numVertexColourBytes,NULL, GL_STATIC_DRAW );
    glBufferSubData( GL_ARRAY_BUFFER, 0, numVertexPositionBytes, vertexPositions );
    glBufferSubData( GL_ARRAY_BUFFER, numVertexPositionBytes, numVertexColourBytes, vertexColours);

    //one buffer for the indices
    glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, buffers[1]);
    glBufferData( GL_ELEMENT_ARRAY_BUFFER, numVertexIndexBytes,vertexIndices, GL_STATIC_DRAW );

    // set up vertex arrays
    GLuint vPosition = glGetAttribLocation( program, "vPosition" );
    glEnableVertexAttribArray( vPosition );
    glVertexAttribPointer( vPosition, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0) );

    GLuint vColor = glGetAttribLocation( program, "vColor" );
    glEnableVertexAttribArray( vColor );
    glVertexAttribPointer( vColor, 4, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(numVertexPositionBytes) );

主要:

int main( int argc, char **argv )
    glutInit( &argc, argv );
    glutInitDisplayMode( GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH );
    glutInitWindowSize(winWidth, winHeight);
    glutCreateWindow( "pendulum" );

    glewInit();
    init();
    //initialiseBoxCoordinates();
    //glutTimerFunc(1,timer,0);
    glutReshapeFunc(reshape);
    glutDisplayFunc( display );
    glutKeyboardFunc( keyboard );
    glutIdleFunc( idle );

    glutMainLoop();

    return 0;

显示:

void display( void ) 
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
    pStack.pushMatrix();
    pStack.loadIdentity();
    pStack.rotated(theta,0.0,1.0,0.0);
    pStack.translated(0.0,0.0,-1.0);

    for(int i = 0; i<NumPVerts; i++)
        pStack.transformd(&pVert[i*4],&pVertActual[i*4]);
    

    glBindVertexArray(lineVao);
    glDrawArrays(GL_LINES,0, lineVertSize/3);

    glBindVertexArray(pVao);

    glBindBuffer(GL_ARRAY_BUFFER, pBuffers[0]);
    glBufferSubData(GL_ARRAY_BUFFER, 0, numPVertexBytes, pVertActual);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, pBuffers[1]);

    glDrawElements(GL_TRIANGLES, NumPIndices, GL_UNSIGNED_BYTE, 0);

    pStack.popMatrix();

    //switch buffers
    glutSwapBuffers();


在矩阵变换之后,顶点都在它们应该在的位置,我之前使用过相同的矩阵类没有问题,所以我不认为是这样。我认为这与着色器有关,但我还是 opengl 的新手,我真的不确定。以下是顶点着色器

in  vec4 vPosition;
in  vec4 vColor;
out vec4 color;

uniform mat4 model_view;
uniform mat4 projection;

void main()  
    gl_Position = projection*model_view*vPosition/vPosition.w;
    color = vColor;
 

还有片段着色器

in  vec4 color;
out vec4 fColor;

void main() 
    fColor = color;
 

【问题讨论】:

为什么要在顶点着色器中“预投影”vPosition 哎呀,我没注意到。这是我从另一个项目中删除的着色器。我删除了它,但同样的事情仍然发生 【参考方案1】:

据我所知,您的着色器还不错。但是你没有在那里使用 #version 标签,这可能会导致一些问题,比如着色器编译错误。

我不明白为什么你的顶点着色器中有vPosition/vPosition.w 的划分。这仍然是由 opengl 管道自动完成的,您不需要这样做。

您的资源中有一些重要的部分被遗漏了。例如,我不知道InitShader(...) 做了什么,也没有看到对glUniform(..) 的任何调用(我想它们隐藏在pStack 对象中?)。而且我没有看到一些重要变量的初始化代码,比如numVertexPositionBytes,或者BUFFER_OFFSET(numVertexPositionBytes) 应该是什么意思。

【讨论】:

你用 pStack.transformd(&pVert[i*4],&pVertActual[i*4]) 做什么?在 CPU 上转换您的顶点数据?为什么?你的矩阵制服还不够吗? 我将 vPosition/vPosition.w 从着色器中拉出,一切都已初始化为正确的值,我已经多次检查了所有初始化器计数。我不知道我必须调用 glUniform,我对此仍然很陌生,并且对我正在做的事情并没有真正的了解。我相信 BUFFER_OFFSET 是用于通知顶点停止和颜色在缓冲区中开始的数字。 pStack 也是一个矩阵堆栈类,如果您需要,我也可以发布代码

以上是关于OpenGL 对象不显示,着色器相关的主要内容,如果未能解决你的问题,请参考以下文章

Opengl 未使用着色器正确绘制 - 矩阵设置/初始化问题?

光照在 OpenGL 中不显示

在opengl矩形上使用着色器会导致它消失[关闭]

OpenGL - glDrawElementsInstanced - 片段着色器和不正确的颜色

在 Qt 线程中应用 OpenGL 着色器

片段着色器中设置的颜色未显示 GLSL 1.30