首页
学习
活动
专区
圈层
工具
发布

VBO无效
EN

Stack Overflow用户
提问于 2013-08-15 13:10:12
回答 1查看 824关注 0票数 0

当我尝试使用vbo时,我只会得到一个黑色屏幕。我在用GLFW和GLEW。它同样适用于纹理,但我并没有使用纹理来判断它是否有效,但出于某种原因,它不是。我让它起作用了,但是我对代码做了一些修改,所以我想我可能做了一些事情。PS:如果代码中有错误,请告诉我,因为我删除了不影响呈现的代码,并且可能删除了重要的意外代码。

下面是main.cpp,其中有一些不影响OpenGL的内容:

代码语言:javascript
复制
//Include all OpenGL stuff, such as gl.h, glew.h, and glfw3.h
#include "gl.h"

//Include a header which adds some functions for loading shaders easier, there is nothing wrong with this code though
#include "shader.h"

float data[3][3] = {
{0.0, 1.0, 0.0},
{-1.0, -1.0, 0.0},
{1.0, -1.0, 0.0}
};

int main()
{

   if (!glfwInit())
    return 1;

    GLFWwindow* window;

    window = glfwCreateWindow(800, 600, "VBO Test", NULL, NULL);
    if (!window)
    {
       glfwTerminate();
       return 1;
    }

    glfwMakeContextCurrent(window);

    if (GLEW_OK != glewInit())
    {
        return 1;
        glfwTerminate();
    }

    //There are normal error handling stuff I do to ensure everything is loaded properly, so the shaders not loading isn't a concern as it'll clearly tell me :)
    GLuint vertexShader = loadShader("shader.vert", GL_VERTEX_SHADER);
    GLuint fragmentShader = loadShader("shader.frag", GL_VERTEX_SHADER);
    GLuint program = createProgram(vertexShader, fragmentShader);

    //Also, the shader files should make everything I draw yellow, and they are not defective

    GLuint vbo;
    glGenBuffers(1, &vbo);

    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
    glVertexPointer(3, GL_FLOAT, 0, 0);

    glBindBuffer(GL_ARRAY_BUFFER, vbo);
    glBufferData(GL_ARRAY_BUFFER, sizeof(data), data, GL_STATIC_DRAW);
    glColorPointer(3, GL_FLOAT, 0, 0);

    while (!glfwWindowShouldClose(window))
    {
        glClear(GL_COLOR_BUFFER_BIT);

        glUsePorgram(program);
        glBindBuffer(GL_ARRAY_BUFFER, vbo);
        glDrawArrays(GL_TRIANGLES, 0, 3);

        glfwSwapBuffers(window);
        glfwPollEvents();
    }

    glfwTerminate();

    return 0;
}

shader.vert

代码语言:javascript
复制
void main(void)
{
   gl_Position = gl_Vertex;
}      

shader.frag

代码语言:javascript
复制
void main()
{
    //Set fragment
    gl_FragColor = vec4( 1.0, 1.0, 0.0, 1.0 );
} 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-15 13:32:40

想到的主要事情是不允许客户端状态的顶点和颜色指针。

由于颜色和位置数据重叠,颜色看起来会有点奇怪。我只从glVertexPointer和glEnableClientState(GL_VERTEX_ARRAY)开始,使用单个glColor3f调用。然后,稍后添加颜色数组。

另外,您要两次将相同的数据缓冲到同一个VBO。VBO只需要在调用glBufferData和gl*指针函数之前进行绑定。

就我个人而言,我不喜欢2D数组,尽管它可能在静态声明时起作用。OpenGL将线性地从内存中提取数据。使用一个结构数组可能会非常好。

下面是一个小例子:http://goanna.cs.rmit.edu.au/~pknowles/SimpleVBO.c

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18253332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档