OpenGL 不渲染一半的点
OpenGL not rendering half the points
我正在尝试构建一个简单的 y=x 曲线,其中 -0.5< x <0.5 且 z = 0。但是由于某种原因,一半的 x 点没有被渲染。为了简单起见,我使用点基元,而不使用任何索引缓冲区。
我检查了 x 值是否正确生成并且在范围内,但仍然没有显示正半部分 (0< x <0.5)。
代码在这里:
https://github.com/abhimittal664/opengl
我不太确定,但这会不会是因为 MVP 矩阵?我试着用它们做实验,但没有用。
另外请注意,是否有一些方法可以调试着色器文件中的问题?我在intel集成显卡机上用的是visual studio 2017。看起来 visual studio 图形调试器仅适用于 directx。目前我只是尝试通过输出不同颜色的点来获得视觉提示来进行调试。
谢谢
编辑 1:
y = x 函数在顶点着色器中。顶点缓冲区只有 x 值,y,z = 0.
从link中提取到您的代码:
//Vertex buffer definition
struct vertex {
glm::vec3 position;
glm::vec3 color;
};
和
void populate_vertex_buffer(vertex* vertices, int n_vertices) {
...
for (int x = 0; x < n_vertices; x++) {
count = -0.5f + (1.f / n_vertices)*(float)x;
vertices[x].position = glm::vec3((-0.5f + (1.f / n_vertices)*(float)x), 0, 0);
vertices[x].color = glm::vec3(0.0, 0.0, 0.0);
...
所以缓冲区中的数据是XYZRGBXYZRGBXYZRGB...... Y,Z,R,G,B all = 0)
你告诉驱动程序如何读取这个缓冲区:
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
...
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)offsetof(vertex, color));
注意第二个glVertexAttribPointer
。它表明第二个属性(VS 中的 vc
)从位置 offsetof(vertex, color)
开始,然后每种颜色都与前一个颜色连续(第五个参数 = 0)。这对于像 XYZXYZXYZ......RGBRGBRGBRGB...
这样的缓冲区数据很有用
我认为阅读说明是
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6*sizeof(float), NULL);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6*sizeof(float), 3*sizeof(float);
其中 6
来自两个相同属性之间的六个值 XYZRGB。
我正在尝试构建一个简单的 y=x 曲线,其中 -0.5< x <0.5 且 z = 0。但是由于某种原因,一半的 x 点没有被渲染。为了简单起见,我使用点基元,而不使用任何索引缓冲区。 我检查了 x 值是否正确生成并且在范围内,但仍然没有显示正半部分 (0< x <0.5)。
代码在这里: https://github.com/abhimittal664/opengl
我不太确定,但这会不会是因为 MVP 矩阵?我试着用它们做实验,但没有用。
另外请注意,是否有一些方法可以调试着色器文件中的问题?我在intel集成显卡机上用的是visual studio 2017。看起来 visual studio 图形调试器仅适用于 directx。目前我只是尝试通过输出不同颜色的点来获得视觉提示来进行调试。
谢谢
编辑 1: y = x 函数在顶点着色器中。顶点缓冲区只有 x 值,y,z = 0.
从link中提取到您的代码:
//Vertex buffer definition
struct vertex {
glm::vec3 position;
glm::vec3 color;
};
和
void populate_vertex_buffer(vertex* vertices, int n_vertices) {
...
for (int x = 0; x < n_vertices; x++) {
count = -0.5f + (1.f / n_vertices)*(float)x;
vertices[x].position = glm::vec3((-0.5f + (1.f / n_vertices)*(float)x), 0, 0);
vertices[x].color = glm::vec3(0.0, 0.0, 0.0);
...
所以缓冲区中的数据是XYZRGBXYZRGBXYZRGB...... Y,Z,R,G,B all = 0)
你告诉驱动程序如何读取这个缓冲区:
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
...
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glEnableVertexAttribArray(0);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)offsetof(vertex, color));
注意第二个glVertexAttribPointer
。它表明第二个属性(VS 中的 vc
)从位置 offsetof(vertex, color)
开始,然后每种颜色都与前一个颜色连续(第五个参数 = 0)。这对于像 XYZXYZXYZ......RGBRGBRGBRGB...
我认为阅读说明是
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6*sizeof(float), NULL);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6*sizeof(float), 3*sizeof(float);
其中 6
来自两个相同属性之间的六个值 XYZRGB。