我正在尝试运行此代码,该代码应呈现一个简单的三角形。它正确启动,但我只看到我的灰色背景,没有三角形。
您是否知道我做错了什么?
以下是代码:
#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;
}
答案 0 :(得分:3)
老实说,OpenGl的错误消息和数量有时不能自我解释。
您仍应使用glGetError
,glGetShaderiv
与GL_COMPILE_STATUS
和glGetProgramiv
与GL_LINK_STATUS
一起检测是否一切正常。
如果您使用它,您会看到无法编译着色器。
如果着色器未编译,则应使用glGetShaderInfoLog
找出原因。
OpenGL报告错误是:
错误:0:2:无效的限定符&#39; in&#39;在全局变量上下文中
通常情况下,这应该是您提供问题的信息。
in
和out
限定符的问题在于,它们不是glsl 1.2
的一部分,您使用已弃用的attribute
和{{1} }。
只要没有真正的理由使用OpenGL&lt; varying
(例如,为了维护旧程序),您不应该学习库中已弃用的部分。
答案 1 :(得分:2)
问题来自顶点着色器程序,对于版本1.2,它应该使用属性而不是:
"in vec4 vp;"
变为
"attribute vec4 vp;"