c++ - 同时与两个片段着色器发生碰撞
问题描述
我的意图是,物体在屏幕上占据的空间越小,物体看起来就越不亮。
这是片段着色器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);
}
然后我将着色器附加到程序对象。现在,有问题的部分来了。我想知道这是否可以接受或完全一团糟。我创建了一个命名缓冲区,然后将其绑定到GL_ATOMIC_COUNTER_BUFFER
绑定点。然后,我将它绑定到绑定号 3。我将计数器重置为零。之后,我的意图是在第二个片段着色器中重用原子计数器缓冲区,因此我将其绑定到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
身体,而是创建第二个程序对象吗?
解决方案
我终于让设计工作了!
我遵循了评论中的好建议。总结一下:我创建了两个带有相同顶点着色器的程序对象。之后,我调用program
(使用片段着色器fs_1
)如下:
glUseProgram(program);
glDrawArrays(GL_TRIANGLES, 0, 3);
出于某种原因,我不必调用glMemoryBarrier
or glColorMask
。
然后我在渲染循环中进行了以下调用:
virtual void render(double currentTime) {
glUseProgram(program1);
glDrawArrays(GL_TRIANGLES, 0, 3);
}
在那里,我使用了第二个程序对象program1
(使用片段着色器fs_2
)。我想它可以工作,因为每个程序对象中都需要一个顶点着色器,而不仅仅是一个。然后我第一次画了三角形,没有任何颜色输出,只是为了计算面积。然后我第二次画了它,使用“计数面积”来计算三角形的亮度。
我还意识到,只有在您发出绘图调用时才会执行着色器。
推荐阅读
- kotlin - 将多个 Kotlin 流程与同步相结合
- algorithm - 在继承人之间分配艺术收藏品,针对特定分配,最小化均方误差
- reactjs - 使用 React 中的 excelJS 库读取存储在项目文件夹中的 excel(.xlsx) 文件
- macos - openVPN : 将 vpn 连接到运行 wireGuard 作为隧道协议的 utun 接口
- xcode - IB 约束在设备上不显示相同
- ibm-cloud - 使用 Cloudant 节点的 Node-RED“TypeError:无法读取 null 的属性‘匹配’”
- vue.js - Vue.js 谷歌分析和标签管理器
- javascript - 如何在 React js 中映射 JSON 数据?
- python - 使用 python 或 C# 将表格数据从宽格式转换为长格式
- javascript - 在 javascript ( alpine ) 中保留换行符