簡體   English   中英

如何在頂點着色器中使用 VBO 數據作為 position 數據和在片段着色器中使用統一數據作為顏色數據

[英]How to use VBO data as position data in vertex shader and uniform data as color data in fragment shader

這是我的代碼,它們是從《OpenGL 編程指南》一書中的代碼轉換而來的:

GLuint VAOs,Buffers;
void init(){
   glGenVertexArrays(1, VAOs);
   glBindVertexArray(VAOs);
   GLfloat vertices[6][2] = {
        {-0.9f,-0.9f},
        {0.85f,-0.90f},
        {-0.90f, 0.85f},
        {0.90f, -0.85f},
        {0.90f,0.90f},
        {-0.85f, 0.90f}
    };
    glGenBuffers(1, Buffers);
    glBindBuffer(GL_ARRAY_BUFFER, Buffers);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);


    ShaderInfo shaders[] = { {GL_VERTEX_SHADER, "triangles.vert"},{GL_FRAGMENT_SHADER, "triangles.frag"} ,{GL_NONE, NULL} };

    program = LoadShaders(shaders); 

    GLuint pos = glGetAttribLocation(program, "vposition");
    glVertexAttribPointer(pos, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));
    glEnableVertexAttribArray(pos);

    GLuint index,b;
    char *name[]={"color"};
    GLfloat fcolor[4]={1.0,0.0,0.0,1.0};
    glGetUniformIndices(program,1,(const char**)name,&index);
    glGenBuffers(1, &b);
    glBindBuffer(GL_UNIFORM_BUFFER, Buffers[ArrayBuffer]);
    glBufferData(GL_UNIFORM_BUFFER, sizeof(fcolor), fcolor, GL_STATIC_DRAW);
    glBindBufferBase(GL_UNIFORM_BUFFER, index, b);

    glUseProgram(program);
}

這是頂點着色器:

#version 430 core
uniform vec4 fcolor;
layout(location=3)in vec4 vposition;
void
main()
{
    vec4 p = vposition;
    gl_Position = p;
}

這是片段着色器:

#version 430 core
uniform vec4 color;
out vec4 fColor;
void
main()
{
    fColor = color;
}

我以為黑色背景上會有一個紅色三角形,但實際上只有一個黑色 window。 我不知道為什么,請幫助我!

uniform vec4 color; 不是統一塊(另請參見統一緩沖區 Object )。
它只是一個統一變量(在默認統一塊內)。 所以你必須使用glUniform*來設置值。

glUseProgram(program);
glUniform4fv(index, 1, fcolor);

您的代碼中的另一個錯誤是緩沖區 object 是數組緩沖區( Buffers[ArrayBuffer] )綁定到目標GL_UNIFORM_BUFFER 可能統一緩沖區 object 是b

glBindBuffer(GL_UNIFORM_BUFFER, Buffers[ArrayBuffer]);

glBindBuffer(GL_UNIFORM_BUFFER, b);

當然,您可以使用命名的Uniform Buffer 在示例中, 綁定點Layout Qualifier設置。 例如:

#version 430 core

layout (std140, binding = 1) uniform UB_color
{
   vec4 color;
};

out vec4 fColor;

void main()
{
    fColor = color;
}
GLuint ubo;
glGenBuffers(1, &ubo);
glBindBuffer(GL_UNIFORM_BUFFER, ubo);
glBufferData(GL_UNIFORM_BUFFER, sizeof(fcolor), fcolor, GL_STATIC_DRAW);
glBindBufferBase(GL_UNIFORM_BUFFER, 1, ubo); // 1 because of 'binding = 1'

如果您不想通過布局限定符設置統一的塊綁定(無論出於何種原因):

layout (std140, binding = 1) uniform UB_color

layout (std140) uniform UB_color
GLuint ubo_index = glGetUniformBlockIndex(program, "UB_color");
GLuint ubo_binding = 7; // arbitrary number
glUniformBlockBinding(program, ubo_index, ubo_binding);
glBindBufferBase(GL_UNIFORM_BUFFER, ubo_binding, ubo); 

代替

layout(location=3)in vec4 vposition;

layout(location=3)in vec2 vposition;

並替換

vec4 p = vposition

vec4 p = vec4(vposition.x, vposition.y, 0.0, 1.0)

在這段代碼中:

glVertexAttribPointer(pos, 2, GL_FLOAT, GL_FALSE, 0, BUFFER_OFFSET(0));

您正在加載一個大小為 2 個浮點數的頂點屬性,然后在着色器中告訴它給出 4 個浮點數(Vector4 在 GLSL 中只是 4 個浮點數)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM