OpenGL 扩展问题

OpenGL extension issue

我一直在努力学习 Opengl 的基础知识,遵循这一系列教程:

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

因此我正在使用 freeglut 和 glew(版本 1.13)。

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

编译着色器时,我会得到一个 'error : GL_ARB_explicit_attrib_location not supported in this version',即使我要求的上下文是 4.0。

查看我的显卡,我意识到我有两个显卡,并且在我有支持 OpenGL 4.5 的 Radeon R9 M295x 时使用的是性能较弱的英特尔显卡。

然后我将上下文切换到 Opengl 4.3,这次出现了这个错误: 'error #5 : Extension : explicit location is not supported in this version'.

我理解错了什么?我以为我可以在 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' 属性。 我有两个几乎相同的顶点着色器,似乎我在调试错误的一部分时间,这没有帮助。

这些错误确实不直观,但在这种情况下似乎帮助不大。嗯嗯