gpt4 book ai didi

c++ - 同时与两个片段着色器发生碰撞

转载 作者:太空宇宙 更新时间:2023-11-04 12:46:11 25 4
gpt4 key购买 nike

我的意图是,一个对象在屏幕上占据的空间越小,该对象就应该显得越暗。

这是片段着色器fs_1

        #version 450 core                                          
layout (binding = 3, offset = 0) uniform atomic_uint area;

void main(void) {
atomicCounterIncrement(area);
}

那是第二个片段着色器,fs_2

        #version 450 core                           
layout (binding = 3) uniform area_block {
uint counter_value;
};
out vec4 color;
layout(location = 4) uniform float max_area;

void main(void){
float brightness = clamp(float(counter_value) / max_area, 0.0, 1.0);
color = vec4(brightness, brightness, brightness, 1.0);
}

然后我将着色器附加到程序对象。现在,有问题的部分来了。我想知道这是可以接受的还是一团糟。我创建了一个命名缓冲区,然后将其绑定(bind)到 GL_ATOMIC_COUNTER_BUFFER 绑定(bind)点。然后,我将它绑定(bind)到绑定(bind)编号 3。我将计数器重置为零。在那之后,我打算在第二个片段着色器中重用原子计数器缓冲区,所以我将它绑定(bind)到 GL_UNIFORM_BUFFER 目标。最后,我将最大预期区域传递给第二个着色器,以计算亮度。

    glUseProgram(program);
GLuint buf;
glGenBuffers(1, &buf);
glBindBuffer(GL_ATOMIC_COUNTER_BUFFER, buf);
glBufferData(GL_ATOMIC_COUNTER_BUFFER, 16 * sizeof(GLuint), NULL, GL_DYNAMIC_COPY);
glBindBufferBase(GL_ATOMIC_COUNTER_BUFFER, 3, buf);

const GLuint zero = 0;
glBufferSubData(GL_ATOMIC_COUNTER_BUFFER, 2 * sizeof(GLuint), sizeof(GLuint), &zero);

glBindBufferBase(GL_UNIFORM_BUFFER, 3, buf);

glUniform1f(4, info.windowHeight * info.windowWidth);//max_area

像这样,好像不行。我想我还需要在某处插入 glColorMask。这是为了关闭第一个片段着色器的输出。此外,我想,我必须对 glMemoryBarrier 做些什么。还是没有必要?我是否以错误的顺序调用了函数?

我在互联网上没有找到真正的引用资料,也没有关于如何实现它的示例代码。如果有任何答案,我将不胜感激。

编辑:

此外,我还收到了一些使问题变得明显的错误消息:

glLinkProgram failed to link a GLSL program with the following program info log: 'Fragment shader(s) failed to link.
Fragment link error: INVALID_OPERATION.
ERROR: 0:8: error(#248) Function already has a body: main
ERROR: error(#273) 1 compilation errors. No code generated

我很快就指出这可能是问题所在,两个片段着色器具有 main 主体。那么我该如何解决呢?我可以保留两个 main 主体,而是创建第二个程序对象吗?

最佳答案

我终于让设计生效了!

我听从了评论中的重要建议。总结一下:我创建了两个程序对象,它们附加了相同的顶点着色器。之后,我调用了程序(使用片段着色器fs_1)如下:

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

出于某种原因,我不必调用 glMemoryBarrierglColorMask

然后我在渲染循环中进行了以下调用:

virtual void render(double currentTime) {   
glUseProgram(program1);
glDrawArrays(GL_TRIANGLES, 0, 3);
}

在那里,我使用了第二个程序对象,program1(带有片段着色器fs_2)。我想它是可行的,因为每个程序对象中都需要一个顶点着色器,而不仅仅是一个。然后我第一次画了三角形,没有任何颜色输出,只是为了计算面积。然后我第二次画了它,使用“计算面积”来计算三角形的亮度。

我还意识到,只有在发出绘制调用时才会执行着色器。

关于c++ - 同时与两个片段着色器发生碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51448608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com