c++ - opengl 中的缓冲区数据问题 = 仅当我缓冲的字节数超过需要时才绘制

标签 c++ opengl

这里是代码 main.cpp 的粘贴箱和 shaders .它使用 devIL、glload 和 glfw。在 windows 和 linux 上运行。任何名为 pic.png 的 png 都将加载。

我以相当正常的方式缓冲我的数据。只是一个简单的三角形。

glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
//vX     vY    vZ   vW       nX   nY   nZ     U    V        
float bufferDataThree[9*3] = {  
-1.0f, -1.0f, 0.0f,1.0f,    0.0f,1.0f,0.0f,  0.0f,0.0f,
1.0f, -1.0f, 0.0f,1.0f,    0.0f,1.0f,0.0f,  0.0f,1.0f,
1.0f,  1.0f, 0.0f,1.0f,    0.0f,1.0f,0.0f,  1.0f,1.0f};
//TOTAL 4 + 3 + 2 = 9;  
glBufferData(GL_ARRAY_BUFFER, (9*3)*4, bufferDataThree, GL_STATIC_DRAW); //Doesnt Work
//glBufferData(GL_ARRAY_BUFFER, (10*3)*4, bufferDataThree, GL_STATIC_DRAW); //Works

有 9*3 = 27 个 float 。因此 108 字节。如果我缓冲 108 个字节,它会搞砸纹理坐标。如果我缓冲 116 个字节,(多 2 个 float )它呈现得很好。

我的展示方式。

void display()
{
    glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glUseProgram(program);

    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D,tbo);

    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glEnableVertexAttribArray(0);
    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, (4 + 3 + 2)*sizeof(float), 0);
    glEnableVertexAttribArray(1);
    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, (4 + 3 + 2)*sizeof(float),(void*) (4*sizeof(float)));
    glEnableVertexAttribArray(2);
    glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, (4 + 3 + 2)*sizeof(float),(void*) ((4+3)*sizeof(float)));

    glDrawArrays(GL_TRIANGLES,0,3);
    glDisableVertexAttribArray(0);
    glUseProgram(0);

    glfwSwapBuffers();
}

这怎么会发生?

最佳答案

glVertexAttribPointer 的第二个参数是组件的数量,对于纹理坐标,它是 2,对于法线是 3。

关于c++ - opengl 中的缓冲区数据问题 = 仅当我缓冲的字节数超过需要时才绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16679020/

相关文章:

c++ - VS : Include ressource files in build/exe

c++ - 在抛出 'std::length_error' what(): basic_string::_S_create 实例后终止调用

c++ - 这段 C++ 代码是如何工作的?未初始化的指针

python - 将 kivy 纹理转换为 opencv 图像

c - 你将如何解决这个 opengl 必要性(在 c 中),涉及知道用户点击了棋盘游戏中的哪个方 block ?

c++ - 检查一个点是否在 "gluPartialDisk"内(OpenGL 和 C++)

c++ - 如何避免boost中的有理数标准化?

c# - p/invoke 不平衡堆栈错误

c++ - 为什么在这种情况下将此指针视为右值?

c++ - MinGW 找不到 inttypes.h