我正在使用 GLEW 和 GLFW。我的程序构建成功,但是当它运行时,我得到的只是黑屏。我知道这不是着色器代码的问题,因为我已经在 QT 中测试了 installShaders 函数并且它运行良好,所以我假设我错误地使用了 GLFW。
#include <stdio.h>
#include <stdlib.h>
#include <GL\glew.h>
#include <GLFW\glfw3.h>
GLFWwindow* window;
extern const char* vertexShaderCode;
extern const char* fragmentShaderCode;
void sendDataToOpenGL()
{
GLfloat verts[] =
{
+0.0f, +1.0f,
+1.0f, +0.0f, +0.0f,
-1.0f, -1.0f,
+1.0f, +0.0f, +0.0f,
+1.0f, -1.0f,
+1.0f, +0.0f, +0.0f,
};
GLuint vertexBufferID;
glGenBuffers(1, &vertexBufferID);
glBindBuffer(GL_ARRAY_BUFFER, vertexBufferID);
glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 5, 0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 5, (char*)(sizeof(float) * 2));
GLushort indices[] = { 0,1,2 };
GLuint indexBufferID;
glGenBuffers(1, &indexBufferID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferID);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
}
void installShaders()
{
GLuint vertexShaderID = glCreateShader(GL_VERTEX_SHADER);
GLuint fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER);
const char* adapter[1];
adapter[0] = vertexShaderCode;
glShaderSource(vertexShaderID, 1, adapter, 0);
adapter[0] = fragmentShaderCode;
glShaderSource(fragmentShaderID, 1, adapter, 0);
glCompileShader(vertexShaderID);
glCompileShader(fragmentShaderID);
GLuint programID = glCreateProgram();
glAttachShader(programID, vertexShaderID);
glAttachShader(programID, fragmentShaderID);
glLinkProgram(programID);
glUseProgram(programID);
}
int main( void )
{
if( !glfwInit() )
{
fprintf( stderr, "Failed to initialize GLFW\n" );
return -1;
}
glfwWindowHint(GLFW_SAMPLES, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
window = glfwCreateWindow( 1024, 768, "OpenGL Graphics", NULL, NULL);
if( window == NULL ){
fprintf( stderr, "Failed to open GLFW window.\n" );
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
glewExperimental = true;
if (glewInit() != GLEW_OK) {
fprintf(stderr, "Failed to initialize GLEW\n");
return -1;
}
glfwSetInputMode(window, GLFW_STICKY_KEYS, GL_TRUE);
sendDataToOpenGL();
installShaders();
do{
glClear( GL_COLOR_BUFFER_BIT );
glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, 0);
glfwSwapBuffers(window);
glfwPollEvents();
}
while( glfwGetKey(window, GLFW_KEY_ESCAPE ) != GLFW_PRESS &&
glfwWindowShouldClose(window) == 0 );
glfwTerminate();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您在启动代码(glfwWindowHint调用)中指定了 OpenGL 3.3 核心配置文件。您的代码与核心配置文件不兼容。不推荐使用顶点缓冲区和不使用顶点数组对象 (VAO) 进行绘图。在 3.3 规范的“E.2.2 删除功能”部分下:
默认顶点数组对象(名称为零)也已弃用。当没有缓冲区对象或没有顶点数组对象被绑定时调用 VertexAttribPointer 将产生一个 INVALID_OPERATION 错误,当没有顶点数组对象被绑定时调用任何数组绘制命令也是如此。
当你没有输出时,我总是做的第一件事是glGetError()在绘图的末尾添加一个调用。在这种情况下,您应该会看到错误返回,然后可以添加其他glGetError()调用来本地化哪个 OpenGL 调用触发了错误。
要验证这是否是您代码中的唯一问题,您可以暂时删除该GLFW_OPENGL_CORE_PROFILE标志。
| 归档时间: |
|
| 查看次数: |
2296 次 |
| 最近记录: |