首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL "Hello Triangle“导致黑屏,版本问题?

OpenGL "Hello Triangle“导致黑屏,版本问题?
EN

Stack Overflow用户
提问于 2016-07-11 15:59:12
回答 1查看 518关注 0票数 0

我正在尝试运行Anton Gerdelan的教程"hello三角形“中的代码,我基本上只是将其复制粘贴到QtCreator中。

我包括: GL/glew.h,GLFW/glfw3.h,stdio.h。

代码语言:javascript
复制
int main () {
// start GL context and O/S window using the GLFW helper library
if (!glfwInit ()) {
  fprintf (stderr, "ERROR: could not start GLFW3\n");
  return 1;
}

GLFWwindow* window = glfwCreateWindow (640, 480, "Hello Triangle", NULL, NULL);
if (!window) {
  fprintf (stderr, "ERROR: could not open window with GLFW3\n");
  glfwTerminate();
  return 1;
}
glfwMakeContextCurrent (window);

// start GLEW extension handler
glewExperimental = GL_TRUE;
glewInit ();

// get version info
const GLubyte* renderer = glGetString (GL_RENDERER); // get renderer string
const GLubyte* version = glGetString (GL_VERSION); // version as a string
printf ("Renderer: %s\n", renderer);
printf ("OpenGL version supported %s\n", version);

// tell GL to only draw onto a pixel if the shape is closer to the viewer
glEnable (GL_DEPTH_TEST); // enable depth-testing
glDepthFunc (GL_LESS); // depth-testing interprets a smaller value as   "closer"

float points[] = {
0.0f,  0.5f,  0.0f,
0.5f, -0.5f,  0.0f,
-0.5f, -0.5f,  0.0f
};


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

GLuint vao = 0;
glGenVertexArrays (1, &vao);
glBindVertexArray (vao);
glEnableVertexAttribArray (0);
glBindBuffer (GL_ARRAY_BUFFER, vbo);
glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 0, NULL);

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

const char* fragment_shader =
"#version 120\n"
"out vec4 frag_colour;"
"void main () {"
"  frag_colour = 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, fs);
glAttachShader (shader_programme, vs);
glLinkProgram (shader_programme);

while (!glfwWindowShouldClose (window)) {
// wipe the drawing surface clear
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram (shader_programme);

glBindVertexArray (vao);
// draw points 0-3 from the currently bound VAO with current in-use shader
glDrawArrays (GL_TRIANGLES, 0, 3);
// update other events like input handling
glfwPollEvents ();
// put the stuff we've been drawing onto the display
glfwSwapBuffers (window);
}

// close GL context and any other GLFW resources
glfwTerminate();
return 0;
}

在阅读了旧的类似主题Black screen on Anton's OpenGL Hello Triangle Tutorial后,我遵循了建议,并在着色器中将#version从400更改为120,因为程序告诉我:

代码语言:javascript
复制
Renderer: Mesa DRI Intel(R) G41 
OpenGL version supported 2.1 Mesa 11.2.0

然而,我仍然得到一个空的黑色窗口。我用这个来找出错误所在:

代码语言:javascript
复制
if (glGetError() == GL_NO_ERROR) {
    qDebug() << "no errors";
}
else {
    qDebug() << "errors" ;
}

显然它在glUseProgram (Shader_programme)中;

我能做些什么?是我的GPU太弱而无法运行这段代码,还是我做错了什么?

谢谢你的帮助,

劳里安。

编辑:

我添加了以下调试:

代码语言:javascript
复制
GLuint shader_programme = glCreateProgram ();
glAttachShader (shader_programme, vs);
glAttachShader (shader_programme, fs);
glLinkProgram (shader_programme);


GLint isCompiled ;
glGetShaderiv(shader_programme, GL_COMPILE_STATUS, &isCompiled);
if (isCompiled == GL_FALSE)
{
    qDebug() << "not compiled" ;
    GLint maxLength = 0;
    glGetShaderiv(shader_programme, GL_INFO_LOG_LENGTH, &maxLength);
    qDebug() << maxLength ;
    // The maxLength includes the NULL character
    std::vector<GLchar> errorLog(maxLength);
    glGetShaderInfoLog(shader_programme, maxLength, &maxLength, &errorLog[0]);

 }

 GLint isLinked ;
glGetProgramiv( shader_programme, GL_LINK_STATUS, &isLinked); ;
if (isLinked == GL_FALSE) {
    qDebug() << "not linked" ;
    GLint maxLength2 = 0;
    glGetShaderiv(shader_programme, GL_INFO_LOG_LENGTH, &maxLength2);
    qDebug() << maxLength2 ;
    // The maxLength includes the NULL character
    std::vector<GLchar> errorLog(maxLength2);
    glGetShaderInfoLog(shader_programme, maxLength2, &maxLength2, &errorLog[0]);
 }

它返回“未链接”,0。

代码语言:javascript
复制
GLint success;
glGetProgramiv(shader_programme, GL_LINK_STATUS, &success);
if(!success)
{
    GLchar infoLog[512];
    glGetProgramInfoLog(shader_programme, 512, NULL, infoLog);
    qDebug() << infoLog ;
}

返回:错误:使用未编译的着色器链接错误:使用未编译的着色器链接。

由于主题混乱(因为我),我想回忆一下,当我将我的着色器更改为以下着色器时,它工作得很好:

代码语言:javascript
复制
const char* vertex_shader =
"#version 120\n"
"attribute vec3 vp;"
"void main () {"
"  gl_Position = vec4 (vp, 1.0);"
"}";

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

这让我觉得这可能是兼容性问题..。

编辑编辑:在BDL的建议下,我意识到我的调试是胡说八道,并将其更改为:

代码语言:javascript
复制
GLint isCompiled ;
glGetShaderiv(vs, GL_COMPILE_STATUS, &isCompiled);
if (isCompiled == GL_FALSE)
{
    qDebug() << "vs not compiled" ;
    GLint maxLength = 0;
    glGetShaderiv(vs, GL_INFO_LOG_LENGTH, &maxLength);
    GLchar errorLog[maxLength];
    glGetShaderInfoLog(vs, maxLength, NULL, errorLog);
    qDebug() << errorLog ;
}

glGetShaderiv(fs, GL_COMPILE_STATUS, &isCompiled);
if (isCompiled == GL_FALSE)
{
    qDebug() << "fs not compiled" ;
    GLint maxLength = 0;
    glGetShaderiv(fs, GL_INFO_LOG_LENGTH, &maxLength);
    GLchar errorLog[maxLength];
    glGetShaderInfoLog(fs, maxLength, NULL, errorLog);
    qDebug() << errorLog ;
}

输出为:

代码语言:javascript
复制
vs not compiled
0:1(10): error: GLSL 2.10 is not supported. Supported versions are: 1.10, 1.20, and 1.00 ES

fs not compiled
0:1(10): error: GLSL 2.10 is not supported. Supported versions are: 1.10, 1.20, and 1.00 ES

多亏了glWindowHint (这是我在不启用打开窗口的情况下可以拥有的最大版本)并设置了#version210,我要求使用版本2.1。

当我询问版本1.2和设置版本120时,我得到错误: vs not compiled 0:2(1):error:in' qualifier in declaration ofvp‘仅对GLSL1.20fs not compiled中的函数参数有效0:2(1):error:out' qualifier in declaration offrag_colour’仅对GLSL1.20中的函数参数有效

这导致我改变我的着色器到“属性”等旧语法。我越来越确信,我只是不能在这台非常便宜的计算机上运行新的OpenGL,但如果你们说我可以,我相信你们。

EN

回答 1

Stack Overflow用户

发布于 2016-07-12 02:54:03

GLSL未编译0:1(10):错误:不支持

2.10。支持的版本包括: 1.10、1.20和1.00 ES

这个错误信息非常清楚。您应该知道GLSL 2.10甚至不存在。GLSL2.1附带了OpenGL版本1.20,所以这是你应该使用的。由于历史原因,GLSL版本和GL版本之间的映射有点单一。有关详细信息,请查看this answer

当我请求1.2版时使用

首先,你也不能这样做。询问特定版本是在GL3.x中引入的。询问GL 2.1或询问1.2没有区别,您得到的结果与根本不询问特定版本时得到的结果相同。这通常是兼容性配置文件中支持的最高GL版本。在实践中,这意味着你最有可能在不支持兼容性配置文件的实现上获得2.1,或者仅仅是你的GPU支持的最高版本,甚至在nvidia或AMD的专有驱动程序上达到最近的4.5。您可以查看this answer以了解更多详细信息。

并设置#version 120,我得到了错误:

vs未编译0:2(1):error: in‘声明ofvp中的限定符’仅对GLSL 1.20中的函数参数有效fs未编译0:2(1):error: out‘声明offrag_colour中的限定符’仅对GLSL 1.20中的函数参数有效

这个错误信息也非常清楚。正如@HolyBlackCat已经在评论中指出的那样,您不能使用GLSL1.20中的通用inout语法;该语法是在GLSL1.30/ OpenGL 3.0中引入的(引入了几何着色器作为第三个可编程阶段)。您不能简单地使用一些GLSLGSL1.30代码,将版本改回GLSL1.20,然后只希望它能工作。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38301870

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档