按照这一系列教程,我一直在尝试学习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时使用功能较弱的Intel。
然后我将上下文切换到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;
}
答案 0 :(得分:0)
在顶点着色器(叹气)中出现了一个分号错误,并且出现了一个&#39; out&#39;属性缺失。 我有两个几乎相同的顶点着色器,似乎我正在调试错误的一部分时间,这没有帮助。
这些错误确实不直观,但在这种情况下似乎没什么帮助。好吧。