我是堆叠溢出的新手。我有以下问题:我希望在我的窗口中有一个旋转的三角形。 现在,我已经设法让我的代码运行,我有一个旋转的三角形。但是,我想重写代码用于学习目的,添加以下两个主要内容:
我特此提及" OpenGL Superbible"书。 我将为您提供一些代码段:
glGenVertexArrays(1, &vao);
static const vertex vertices[] = {
{ 0.25, -0.25, 0.5, 1.0 ,
1.0, 0.0, 0.0, 1.0},
{ -0.25, -0.25, 0.5, 1.0,
0.0, 1.0, 0.0, 1.0 },
{ 0.25, 0.25, 0.5, 1.0,
0.0, 0.0, 1.0, 1.0 }
};
glCreateBuffers(1, &buffer);
glNamedBufferStorage(buffer, sizeof(vertices), NULL, 0);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
void * ptr = glMapNamedBuffer(buffer, GL_WRITE_ONLY);
memcpy(ptr, vertices, sizeof(vertices));
glUnmapNamedBuffer(GL_ARRAY_BUFFER);
glVertexArrayVertexBuffer(vao, 0, buffer, 0, sizeof(vmath::vec4));
// Positions
glVertexArrayAttribBinding(vao, 0, 0);
glVertexArrayAttribFormat(vao, 0, 4, GL_FLOAT, GL_FALSE, offsetof(vertex, x));
glEnableVertexArrayAttrib(vao, 0);
// Color
glVertexArrayAttribBinding(vao, 1, 0);
glVertexArrayAttribFormat(vao, 1, 4, GL_FLOAT, GL_FALSE, offsetof(vertex, r));
glEnableVertexArrayAttrib(vao, 1);
glVertexArrayVertexBuffer(vao, 0, buffer, 0, sizeof(vertex));
我按如下方式设置顶点结构:
struct vertex {
// Position
float x;
float y;
float z;
float w;
// Color
float r;
float g;
float b;
float a;
};
第一次,我在顶点着色器中对颜色进行了硬编码。我在数据阵列中有位置数据。我通过调用' glNamedBufferStorage'直接设置数据。而不是(现在的情况)插入NULL。那时候,它奏效了。但是当我改变这两件事时,它就停止了工作。我知道,这两个主要步骤都包含一些错误。
在这里,我将为您提供顶点着色器。顺便说一下,mvp矩阵是有效的,所以不是问题。
#version 420 core
layout (location = 0) in vec4 position;
layout (location = 1) in vec4 color;
out vec4 vs_color;
uniform mat4 mvp;
void main(void)
{
gl_Position = mvp * position;
vs_color = color;
}
任何提示都将不胜感激。
答案 0 :(得分:0)
代码中有几个问题:
glUnmapNamedBuffer
将缓冲区句柄作为参数,而不是GLenum。将glUnmapNamedBuffer(GL_ARRAY_BUFFER);
更改为glUnmapNamedBuffer(buffer);
。 (你应该检查返回值,当出现问题时返回false)。
glVertexArrayVertexBuffer
的步伐是错误的。每个顶点在前一个(或sizeof(vertex)
)之后开始8个浮点数。变化
glVertexArrayVertexBuffer(vao, 0, buffer, 0, sizeof(vmath::vec4));
到
glVertexArrayVertexBuffer(vao, 0, buffer, 0, sizeof(vertex));