[英]Switching from OpenGL 2.1 with GLSL 1.2 to OpenGL 3.3 with GLSL version 1.5 breaks my code
[英]Not able to draw something on screen with OpenGL 2.1 and GLSL 1.2
我正在尝试运行此代码,该代码应呈现一个简单的三角形。 它正常启动,但是我只看到灰色背景,没有三角形。
你知道我在做什么错吗?
这是代码:
#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;
}
老实说,错误消息和OpenGl的编号有时无法自我解释。
你还是应该使用glGetError
, glGetShaderiv
与GL_COMPILE_STATUS
和glGetProgramiv
与GL_LINK_STATUS
来检测,如果一切正常。
如果使用该选项,将会看到无法编译着色器。
如果着色器未编译,则应使用glGetShaderInfoLog
找出原因。
OpenGL报告错误为:
错误:0:2:全局变量上下文中无效的限定词“ in”
通常,这应该是您随问题提供的信息。
与这个问题in
和out
预选赛是,他们不是GLSL的部分1.2
,有你使用已弃用的attribute
和varying
。
只要没有真正的理由使用OpenGL < 3.2
(例如,维护旧程序),您就不应该学习该库不推荐使用的部分。
问题来自顶点着色器程序,对于1.2版,它应使用attribute而不是in:
"in vec4 vp;"
变
"attribute vec4 vp;"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.