OpenGL扩展问题

OpenGL extension issue

本文关键字:问题 扩展 OpenGL      更新时间:2023-10-16

我一直在尝试学习Opengl的基础知识,遵循以下系列教程:

http://in2gpu.com/2014/12/21/change-triangle-color-opengl-4-5/

因此,我使用freeglut和glew(版本1.13)

在顶点着色器开始使用属性的显式位置之前,我对前几个教程没有任何问题。

编译着色器时,我会得到一个"错误:此版本不支持GL_ARB_explicit_attrib_location",尽管我要求的上下文是4.0。

看着我的显卡,我意识到我有两个,当我有一个支持OpenGL 4.5的Radeon R9 M295x时,我使用的是功能较弱的英特尔显卡。

然后我将上下文切换到Opengl 4.3,这次出现了以下错误:"错误#5:扩展:此版本不支持显式位置"。

我误解了什么?我想我可以使用3.3或更高版本的GL_ARB_explicit_attrib_location。为什么在第一种情况下我不能?

第二个错误是什么意思?我找不到任何相关信息。

以下是上下文创建:

glutInit(&argc, argv);
glutInitContextVersion(4,3);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(500, 500);//optional
glutInitWindowSize(800, 600); //optional
glutCreateWindow("OpenGL First Window");
glewExperimental = GL_TRUE;
GLenum err = glewInit();

以下是vao和vbo绑定(顶点包含位置和颜色):

std::vector<Vertex> vertices;
vertices.push_back(Vertex(Vec3f(0.25, -0.25, 0.0), Vec4f(1,0,0,1)));
vertices.push_back(Vertex(Vec3f(-0.25, -0.25, 0.0), Vec4f(0, 1, 0, 1)));
vertices.push_back(Vertex(Vec3f(0.25, 0.25, 0.0), Vec4f(0, 0, 1, 1)));
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex) * 3, &vertices[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)12);

这是顶点着色器:

#version 430 core
// Input vertex data, different for all executions of this shader.
layout(location = 0) in vec3 in_position;
layout(location = 1) in vec4 in_color
out vec4 color;
void main(){
color = in_color; 
gl_Position = vec4(in_position,1);
}

顺便说一句,glew的文档到底在哪里?在网站或zip文件夹中似乎找不到它,键入几个关键词似乎也不会产生任何结果。

编辑:如果我不能使用这个扩展,那么一个指向变通方法的指针也会很有趣。我还没有完全理解关于链接属性的所有内容。

编辑#2:另一件奇怪的事情是,我使用的碎片着色器显然编译时没有问题:

#version 430 core
layout(location = 0) out vec4 out_color; // location specified
in vec4 color;
void main()
{
    out_color =color;
}

啊,好像我发现问题了。

顶点着色器中缺少分号(叹息),缺少"out"属性。我有两个几乎相同的顶点着色器,而且似乎有一段时间我调试错了一个,这没有帮助。

这些错误确实是不直观的,在这种情况下似乎没有多大帮助。啊,好吧。