【发布时间】:2016-10-13 20:02:46
【问题描述】:
我想使用 OpenGL 4.5 渲染一个三角形。我在网上找到了很多使用旧版本 OpenGL 的示例,但没有使用 OpenGL 4.5 函数的示例。因此,我尝试自己“升级”一些代码。这是旧的工作代码:
// Triangles to render
vec3 vertices[2][3] = { { vec3(-0.90f, -0.90f, 1.0f), vec3(0.85f, -0.90f, 1.0f), vec3(-0.90f, 0.85f, 1.0f) },
{ vec3(0.90f, -0.85f, 1.0f), vec3(0.90f, 0.90f, 1.0f), vec3(-0.85f, 0.90f, 1.0f) } };
//Initialize
glGenVertexArrays(1, &vaos);
glBindVertexArray(vaos);
glGenBuffers(1, &buffers);
glBindBuffer(GL_ARRAY_BUFFER, buffers);
glBufferData(GL_ARRAY_BUFFER, sizeof(triangles), triangles, GL_STATIC_DRAW);
ShaderInfo shaders[] = {
{ GL_VERTEX_SHADER, "triangles.vert" },
{ GL_FRAGMENT_SHADER, "triangles.frag" },
{ GL_NONE, NULL }
};
program = LoadShaders(shaders);
glUseProgram(program);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
glEnableVertexAttribArray(0);
//Render
GLint index;
index = glGetUniformLocation(program, "projectionMatrix");
glUniformMatrix3fv(index, 1, true, value_ptr(projectionMatrix));
glClear(GL_COLOR_BUFFER_BIT);
glBindVertexArray(vaos);
glDrawArrays(GL_TRIANGLES, 0, nvertices);
我将它“更新”为这段代码,它似乎没有在屏幕上绘制任何东西:
// Same triangles
// Initialize
glCreateVertexArrays(1, &vaos);
glEnableVertexArrayAttrib(vaos, 0);
glVertexArrayAttribFormat(vaos, 0, 3, GL_FLOAT, GL_FALSE, 0);
glCreateBuffers(1, &buffers);
glNamedBufferData(buffers, sizeof(triangles), triangles, GL_STATIC_DRAW);
glVertexArrayAttribBinding(vaos, 0, 0);
glVertexArrayVertexBuffer(vaos, 0, buffers, 0, 0);
ShaderInfo shaders[] = {
{ GL_VERTEX_SHADER, "triangles.vert" },
{ GL_FRAGMENT_SHADER, "triangles.frag" },
{ GL_NONE, NULL }
};
program = LoadShaders(shaders);
glUseProgram(program);
// Same render
谁能告诉我我做错了什么?
编辑: 三角形片段
#version 450
in vec4 gl_FragCoord;
out vec4 fColor;
void main ()
{
fColor = vec4 (0.0, 0.0, 1.0, 1.0);
}
三角形.vert
#version 450
layout (location = 0) in vec3 vPosition;
uniform mat3 projectionMatrix;
void main ()
{
vec3 tmp = projectionMatrix*vPosition;
gl_Position = vec4 (tmp, 1.0f);
}
【问题讨论】:
-
您需要一个非常现代的图形处理器来支持 OpenGL 4.x 版本,即使如此,如果驱动程序尚不存在,您可能会受限于较早的实现。你在什么上面运行它?着色器是一个常见的问题。
-
我有一台 GTX 760 并安装了最新的驱动程序。我正在使用 glew 加载 OpenGL 扩展,它确认 ARB_direct_state_access 可用。
-
尝试 #version 430 而不是 #version 450 .... 这表示 GTX 760 支持 OpenGL 4.3 geforce.com/hardware/desktop-gpus/geforce-gtx-760/…
-
@ScottStensland:这些只是 GPU 首次发布时的最新 GL 版本。 NVidia 支持 OpenGL 4.5 的所有卡回到 Fermi / Geforce 400。