繁体   English   中英

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

[英]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的编号有时无法自我解释。

你还是应该使用glGetErrorglGetShaderivGL_COMPILE_STATUSglGetProgramivGL_LINK_STATUS来检测,如果一切正常。

如果使用该选项,将会看到无法编译着色器。

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

OpenGL报告错误为:

错误:0:2:全局变量上下文中无效的限定词“ in”

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

与这个问题inout预选赛是,他们不是GLSL的部分1.2 ,有你使用已弃用的attributevarying

只要没有真正的理由使用OpenGL < 3.2 (例如,维护旧程序),您就不应该学习该库不推荐使用的部分。

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

"in vec4 vp;"

"attribute vec4 vp;"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM