Объект OpenGl не отображается, связанный с шейдером

Я пытаюсь выполнить рендеринг в 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;
}

0

Решение

Насколько я вижу, ваши шейдеры в порядке. Но вы не используете #version есть тег, который может привести к некоторым проблемам, таким как ошибки компиляции шейдеров.

Я не понимаю, почему у вас есть разделение vPosition/vPosition.w в вашем вершинном шейдере. Это все еще выполняется автоматически с помощью конвейера opengl, вам не нужно этого делать.

В ваших источниках есть некоторые важные кусочки. Например, я не знаю, что InitShader(...) делает, и я не вижу никаких звонков glUniform(..) (Я полагаю, они скрыты в pStack объект?). И я не вижу код инициализации некоторых важных переменных, таких как numVertexPositionBytes, или что BUFFER_OFFSET(numVertexPositionBytes) должен даже иметь в виду.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]