0

シェーダーを使用して OpenGL でレンダリングしようとしています。背景色が生成され、エラー メッセージは表示されませんが、レンダリングしようとしているオブジェクトが表示されません。私はこれを解決するために一日中努力してきましたが、何も起こりませんでした。ファイルから頂点とインデックスを読み込んで.txtいますが、すべての数値が正確にあるべきものであるため、それは問題ではないようです。これが私の初期化です:

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

1 に答える 1

0

私が見る限り、あなたのシェーダーは大丈夫です。ただし、そこではタグを使用しないため#version、シェーダーのコンパイル エラーなどの問題が発生する可能性があります。

vPosition/vPosition.w頂点シェーダーに部門がある理由がわかりません。これは引き続き opengl パイプラインによって自動的に行われるため、これを行う必要はありません。

あなたの情報源にはいくつかの重要な部分が残されています。たとえば、何が機能するのかInitShader(...)わからず、への呼び出しが表示されませんglUniform(..)(オブジェクトに隠されていると思いpStackますか?)。numVertexPositionBytesそして、 のようないくつかの重要な変数の初期化コード、または何BUFFER_OFFSET(numVertexPositionBytes)を意味すると考えられているのかさえわかりません。

于 2013-10-22T11:59:19.963 に答える