c++ - OpenGL - 使用两个 GL 程序改变顶点的位置

标签 c++ opengl

我正在尝试使用两组着色器。 ImageShader 绘制更大的正方形,GridShader 绘制更小的正方形。在 init 函数中,我声明了程序(在新的 OpenGL::OpenGLShader 中),然后我插入了带有位置的缓冲区 我得到以下结果: (明亮的方 block 是 ImageShader,声明为第二个)

渲染结果
Render result

这里是 init() 函数的代码:

gridShader = new OpenGL::OpenGLShader(Common::GetShaderResource(IDR_SHADERS_GRID_SQUARE_VERTEX), Common::GetShaderResource(IDR_SHADERS_GRID_SQUARE_FRAGMENT));
        gridShader->bind();

        //3x positions
        float verticesSquare[6][3] = {
            -0.5f,  0.5f, 0.0f, 
            0.5f,  0.5f, 0.0f, 
            0.5f, -0.5f, 0.0f, 

        imageShader->unbind();

这里是渲染函数:

void OpenglRenderer::RenderScene() {
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        visualize_image();
        visualize_grid();
        renderToImage();
        SwapBuffers(hdc);
    }

void OpenglRenderer::visualize_image()
    {
        imageShader->bind();
        GLint position = glGetAttribLocation(imageShader->shader_id, "position");
        GLint uvPos = glGetAttribLocation(imageShader->shader_id, "uvPos");
        glEnableVertexAttribArray(position);
        glVertexAttribPointer(position, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), 0);
        glEnableVertexAttribArray(uvPos);
        glVertexAttribPointer(uvPos, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(2 * sizeof(float)));
        glDrawArrays(GL_TRIANGLES, 0, 6);
        glDisableVertexAttribArray(position);
        glDisableVertexAttribArray(uvPos);
        imageShader->unbind();
    }

    void OpenglRenderer::visualize_grid()
    {
        gridShader->bind();
        GLint position = glGetAttribLocation(gridShader->shader_id, "position");
        glEnableVertexAttribArray(position);
        glVertexAttribPointer(position, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), 0);


        glDrawArrays(GL_TRIANGLES, 0, 6);
        glDisableVertexAttribArray(position);
        gridShader->unbind();
    }

最佳答案

因为你想从两个不同的缓冲区中绘制,你必须确保在渲染方法中绑定(bind)了正确的缓冲区(或者更确切地说,在设置顶点属性指针时)。目前,所有数据都取自 vboIndexImage,因为这是调用 glVertexAttribPointer 时绑定(bind)的缓冲区。根据您的设置代码,我猜您甚至不应该在渲染方法中设置顶点属性指针,而是只绑定(bind)正确的 VAO:

设置:

glGenVertexArrays(1, &vaoIndexImage);
glGenBuffers(1, &vboIndexImage);

glBindVertexArray(vaoIndexImage);
glBindBuffer(GL_ARRAY_BUFFER, vboIndexImage);
glBufferData(GL_ARRAY_BUFFER, sizeof(verticesImage), &verticesImage[0][0], GL_STATIC_DRAW);

GLint position = glGetAttribLocation(imageShader->shader_id, "position");
GLint uvPos = glGetAttribLocation(imageShader->shader_id, "uvPos");

glEnableVertexAttribArray(position);
glVertexAttribPointer(position, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), 0);

glEnableVertexAttribArray(uvPos);
glVertexAttribPointer(uvPos, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(2 * sizeof(float)));

渲染:

glBindVertexArray(vaoIndexImage);
glDrawArrays(GL_TRIANGLES, 0, 6);

网格应该使用类似的代码。

关于c++ - OpenGL - 使用两个 GL 程序改变顶点的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48764406/

相关文章:

c++ - 尝试在 C++ 中创建一个按时间顺序存储值而不是向后存储所有内容的单链表

c++ - 一个数组,其中每个元素都是一个数的约数和下一个数的约数

android - c++控制台应用程序连接到android应用程序

java - 在opengl中在矩形窗口上绘制正方形

Java/OpenGL : Getting the image of a Canvas as a BufferedImage

delphi - OpenGL:如何将 2D 形状车床成 3D?

时间:2019-03-08 标签:c++Template[]overload

c++ - 为嵌入式分发构建 Python26.zip 的最简单方法是什么?

c++ - 使用opengl进行真正的等距投影

python - 通过glUnproject从鼠标坐标到世界坐标