Простой треугольник не будет рисовать в OpenGL 4.3
Я пробую свои силы в программировании opengl, загрузил пример кода по умолчанию в кодовых блоках и, выполнив большую часть загрузки указателя на функцию, я получил контекст opengl 4.3 в окне, который можно очистить определенным цветом (ДА!), поэтому я пошел дальше и попытался отрисовать треугольник... ну, это не работает, не уверен, где я ошибся, я был в темных углах Google и моего отладчика, чтобы увидеть, если VBO и создание шейдеров пошло не так...неудачно
вот соответствующий код GL:
GLuint IndiceArray[3] = {
0, 1, 2
};
const float vertexPositions[] = {
0.75f, 0.75f,
0.75f, -0.75f,
-0.75f, -0.75f,
};
const float vertexColors[] = {
1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
};
//Prepare GPU program
vertexID = glCreateShader( GL_VERTEX_SHADER );
fragmentID = glCreateShader( GL_FRAGMENT_SHADER );
glShaderSource(vertexID, 1, &vsSource, NULL) ;
glShaderSource(fragmentID, 1, &fsSource, NULL) ;
glCompileShader( vertexID );
glCompileShader( fragmentID );
programID = glCreateProgram();
glAttachShader( programID, vertexID );
glAttachShader( programID, fragmentID );
glLinkProgram( programID );
glUseProgram( programID );
//Send to OpenGL
glGenBuffers(3, vertexAttribBufferID);
glBindBuffer( GL_ARRAY_BUFFER, vertexAttribBufferID[0] );
glBufferData( GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW );
glBindBuffer( GL_ARRAY_BUFFER, vertexAttribBufferID[1] );
glBufferData( GL_ARRAY_BUFFER, sizeof(vertexColors), vertexColors, GL_STATIC_DRAW );
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, vertexAttribBufferID[2] );
glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof(IndiceArray), IndiceArray, GL_STATIC_DRAW );
colorAttribID = glGetAttribLocation( programID, "colorIn" );
positionAttribID = glGetAttribLocation( programID, "vertexPos" );
/* program main loop */
while (!bQuit)
{
/* check for messages */
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
/* handle or dispatch messages */
if (msg.message == WM_QUIT)
{
bQuit = TRUE;
}
else
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else
{
/* OpenGL animation code goes here */
glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
glClear(GL_COLOR_BUFFER_BIT);
//Render!!
glBindBuffer( GL_ARRAY_BUFFER, vertexAttribBufferID[0] );
glEnableVertexAttribArray( positionAttribID );
glVertexAttribPointer( positionAttribID, 2, GL_FLOAT, GL_FALSE, 0, 0 );
glBindBuffer( GL_ARRAY_BUFFER, vertexAttribBufferID[1] );
glEnableVertexAttribArray( colorAttribID );
glVertexAttribPointer( colorAttribID, 4, GL_FLOAT, GL_FALSE, 0, 0 );
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, vertexAttribBufferID[2] );
glDrawElements( GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0 );
glDisableVertexAttribArray( colorAttribID );
glDisableVertexAttribArray( positionAttribID );
SwapBuffers(hDC);
Sleep (1);
}
И шейдеры:
const char vertexShader[] =
"#version 150 core\n"
"in vec2 vertexPos;\n"
"in vec4 colorIn;\n"
"smooth out vec4 outColor;\n"
"void main()\n"
"{\n"
" gl_Position = vec4(vertexPos, 0.0f, 1.0f);\n"
" outColor = colorIn;\n"
"}";
const char fragShader[] =
"#version 150 core\n"
"smooth in vec4 inColor;\n"
"out vec4 f_color;\n"
"void main()\n"
"{\n"
" f_color = inColor;\n"
"}";
Само собой разумеется, я был бы всегда благодарен за любую помощь, мог бы спасти меня от разочарования от OpenGL!!!
редактировать: я вижу только очищенный фон, если вам интересно...
1 ответ
Хорошо, разобрался: очевидно, данные, которые вы передаете между шейдерами, должны иметь то же имя, что и переменные с обеих сторон, поэтому мой код должен быть:
const char vertexShader[] =
"#version 150 core\n"
"in vec2 vertexPos;\n"
"in vec4 colorIn;\n"
"smooth out vec4 outColor;\n"
"void main()\n"
"{\n"
" gl_Position = vec4(vertexPos, 0.0f, 1.0f);\n"
" outColor = colorIn;\n"
"}";
const char fragShader[] =
"#version 150 core\n"
"smooth in vec4 outColor;\n"
"out vec4 f_color;\n"
"void main()\n"
"{\n"
" f_color = inColor;\n"
"}";