无法使用OpenGL 2.1和GLSL 1.2在屏幕上绘制内容

时间:2014-08-14 07:23:52

标签: c++ opengl glfw

我正在尝试运行此代码,该代码应呈现一个简单的三角形。它正确启动,但我只看到我的灰色背景,没有三角形。

您是否知道我做错了什么?

以下是代码:

#include <GLFW/glfw3.h>
#include <iostream>

using namespace std;

int main(void)
{
GLFWwindow* window;

/* Initialize the library */
if (!glfwInit())
    return -1;

glfwWindowHint (GLFW_CONTEXT_VERSION_MAJOR, 2);
glfwWindowHint (GLFW_CONTEXT_VERSION_MINOR, 1);
glfwWindowHint (GLFW_OPENGL_FORWARD_COMPAT, GL_FALSE);
glfwWindowHint (GLFW_OPENGL_PROFILE, GLFW_OPENGL_ANY_PROFILE);

/* Create a windowed mode window and its OpenGL context */
window = glfwCreateWindow(640, 480, "Hello World", NULL, NULL);
if (!window)
{
    glfwTerminate();
    return -1;
}

/* Make the window's context current */
glfwMakeContextCurrent(window);

// Let's use a grey background color, better for debugging
glClearColor(0.5, 0.5, 0.5, 1);

// First triangle
float points[] = {
    -0.4f, 0.4f, 0.0f, 1.0f,
    0.0f, -0.4f, 0.0f, 1.0f,
    -0.8f, -0.4f, 0.0f, 1.0f
};

GLuint vbo = 0;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

const char* vertex_shader =
"#version 120\n"
"in vec4 vp;"
"void main () {"
"  gl_Position = vp;"
"}";

const char* fragment_shader =
"#version 120\n"
"void main () {"
"  gl_FragColor = vec4 (0.5, 0.0, 0.5, 1.0);"
"}";

GLuint vs = glCreateShader (GL_VERTEX_SHADER);
glShaderSource (vs, 1, &vertex_shader, NULL);
glCompileShader (vs);
GLuint fs = glCreateShader (GL_FRAGMENT_SHADER);
glShaderSource (fs, 1, &fragment_shader, NULL);
glCompileShader (fs);
GLuint shader_programme = glCreateProgram ();
glAttachShader (shader_programme, vs);
glAttachShader (shader_programme, fs);
glLinkProgram (shader_programme);

while (!glfwWindowShouldClose (window) && !glfwGetKey(window, GLFW_KEY_ESCAPE)) {
    // wipe the drawing surface clear
    glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glUseProgram (shader_programme);

    glBindBuffer(GL_ARRAY_BUFFER, vbo);

    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0);
    glDrawArrays (GL_TRIANGLES, 0, 3);
    glDisableVertexAttribArray(0);
    glUseProgram(0);

    // update other events like input handling
    glfwPollEvents ();
    // put the stuff we've been drawing onto the display
    glfwSwapBuffers (window);
}
/* End Actual Code */

glfwTerminate();
return 0;
}

2 个答案:

答案 0 :(得分:3)

老实说,OpenGl的错误消息和数量有时不能自我解释。

您仍应使用glGetErrorglGetShaderivGL_COMPILE_STATUSglGetProgramivGL_LINK_STATUS一起检测是否一切正常。

如果您使用它,您会看到无法编译着色器。

如果着色器未编译,则应使用glGetShaderInfoLog找出原因。

OpenGL报告错误是:

  

错误:0:2:无效的限定符&#39; in&#39;在全局变量上下文中

通常情况下,这应该是您提供问题的信息。

inout限定符的问题在于,它们不是glsl 1.2的一部分,您使用已弃用的attribute和{{1} }。

只要没有真正的理由使用OpenGL&lt; varying(例如,为了维护旧程序),您不应该学习库中已弃用的部分。

答案 1 :(得分:2)

问题来自顶点着色器程序,对于版本1.2,它应该使用属性而不是:

"in vec4 vp;"

变为

"attribute vec4 vp;"