opengl 3.3核心配置文件渲染失败

时间:2014-06-19 10:45:11

标签: c++ opengl glsl

我尝试使用opengl 3.3核心配置文件渲染一个简单的测试着色器。但我得到的只是一个黑色的窗户。

GLFWwindow* window;

GLuint vao;
GLuint vbo[2];
GLuint program;

const GLfloat square[8] = {
    -1.0, -1.0,
    -1.0,  1.0,
    1.0,  1.0,
    1.0, -1.0
};

const GLfloat indices[4] = { 0, 1, 2, 3 };

init opengl核心上下文和窗口

if( !glfwInit() ) {
    std::cerr << "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_FORWARD_COMPAT, GL_TRUE);

// Open a window and create its OpenGL context
window = glfwCreateWindow( 1024, 768, "", 0, 0);
if( window == NULL ) {
    std::cerr << "Failed to open GLFW window.\n";
    glfwTerminate();
    return -1;
}
glfwMakeContextCurrent(window);

// Initialize GLEW
if (gl3wInit()) {
    std::cerr << "Failed to initialize GLEW" << std::endl;
    return -1;
}

if (!gl3wIsSupported(3, 3)) {
    std::cerr << "OpenGL Version 3.3 not supported" << std::endl;
    return -1;
}

init vbo及其索引缓冲区,然后是vao,以及着色器程序,将顶点着色器输入绑定到0

glGenBuffers(2, vbo);

glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glBufferData(GL_ARRAY_BUFFER, 8*sizeof(GLfloat), square, GL_STATIC_DRAW);

glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
glBufferData(GL_ARRAY_BUFFER, 4*sizeof(GLushort), indices, GL_STATIC_DRAW);

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

program = glCreateProgram();

GLuint vertex_shader, fragment_shader;

loadShader_FILE(vertex_shader, "shader/default.vsh", GL_VERTEX_SHADER);
glAttachShader(program, vertex_shader);

loadShader_FILE(fragment_shader, "shader/default.fsh", GL_FRAGMENT_SHADER);
glAttachShader(program, fragment_shader);

glBindAttribLocation(program, 0, "pos");

glLinkProgram(program);

开始渲染

glUseProgram(program);

glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glVertexAttribPointer(
            0,
            2,
            GL_FLOAT,
            GL_FALSE,
            sizeof(GLfloat)*2,
            (void*)0);
glEnableVertexAttribArray(0);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[1]);
glDrawElements(
            GL_TRIANGLE_STRIP,
            4,
            GL_UNSIGNED_SHORT,
            (void*)0);

glDisableVertexAttribArray(0);
glfwSwapBuffers(window);

顶点着色器

#version 330
in vec2 pos;
out vec2 c;

void main(void)
{
    gl_Position = vec4(pos, 0.0, 1.0);
    c = (pos+1)*0.5;
}

片段着色器

#version 330
in vec2 c;
out vec4 color;

void main(void)
{
    color = vec4(c, 1, 1);
}

着色器编译没有错误,apitrace无法找到任何opengl错误

1 个答案:

答案 0 :(得分:2)

嗯,这不可能是好的:

const GLfloat indices[4] = { 0, 1, 2, 3 };

你告诉OpenGL这些是无符号短裤,但它们是浮点数。没关系GLfloatGLushort大小两倍的事实,这些数字的表示方式是非常不同的。浮点顶点索引没有多大意义。

相反,你应该使用:

const GLushort indices[4] = { 0, 1, 2, 3 };