[英]GLSL Sending color data form Fragment Shader to Vertex Shader seems to be always equal to 0
[英]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.