gpt4 book ai didi

opengl - 使用几何着色器分层渲染到 CUBEMAP

转载 作者:行者123 更新时间:2023-12-04 12:53:13 65 4
gpt4 key购买 nike

我正在尝试使用单个绘图调用渲染到立方体贴图的所有 6 个面。GL 立方体贴图附加到屏幕外帧缓冲区对象。我得到的结果是只有面号为零受帧缓冲区清除颜色和片段的影响着色器输出。目标是使用几何着色器调用 6 次(每个面一次),然后将 gl_InstanceID 分配给内置 gl_Layer。片段着色器阶段将读取 gl_Layer 值并根据 in 对光栅进行着色。预期所有 6 个面都将涂上取决于 gl_Layer 值的独特颜色。

为了让测试看到我得到了正确的 gl_layer 值,我试图通过以下片段着色器将图层 id 渲染到纹理的 alpha channel 中:

#version 430  

// Ouput data
layout(location = 0) out vec4 color;

in int gl_Layer;

void main(){
color = vec4(0.5,0.5,0.5,float(gl_Layer)/255.0);
}

顶点着色器基本上什么都不做:
#version 430  

in vec3 position;


void main(){
gl_Position = vec4(position, 1.0);
}

并且几何着色器执行6次,渲染一个单位正方形(覆盖整个视口(viewport))并根据gl_InvocationID设置gl_Layer:
#version 430  

layout(triangles, invocations = 6) in;
layout(triangle_strip, max_vertices = 4) out;

out int gl_Layer;

void main()
{
const vec2 vert_data[4] = vec2[]( vec2(-1.0, 1.0), vec2(-1.0, -1.0), vec2(1.0, 1.0), vec2(1.0, -1.0) );

for(int i=0; i<4; i++)
{
gl_Layer = gl_InvocationID;
gl_Position = vec4(vert_data[i].xy,0,1);
EmitVertex();
}

EndPrimitive();
}

最后,这就是我设置纹理和帧缓冲区的方式:
    glGetIntegerv(GL_MAX_COLOR_ATTACHMENTS, &fbtextures_count);
// how many textures to create? depends on complexity of your effects.
glActiveTexture(GL_TEXTURE0);
glGenFramebuffers(1, &framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
glGenTextures(1, &fbcubetexture);
GLenum target = GL_TEXTURE_CUBE_MAP;

// initializing color maps
glBindTexture(target, fbcubetexture);
glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);


initData(255,255, 255);
for (int i = 0; i < 6; i++)
{
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGBA8, cube_s, cube_s, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
}

glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, fbcubetexture, 0);

GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0 };
glDrawBuffers(1, drawBuffers);
glReadBuffer(GL_COLOR_ATTACHMENT0);
glDrawBuffer(GL_COLOR_ATTACHMENT0);
glBindFramebuffer(GL_FRAMEBUFFER, 0);

我正在阅读客户端上的面孔颜色:
 for (int i = 0; i < 6; i++)
{
glGetTexImage(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGBA,GL_UNSIGNED_BYTE, data);
}

我得到的 GL_TEXTURE_CUBE_MAP_POSITIVE_X 的结果是正确的。但面部的其余部分保持相同的第一个初始化值。我还使用 NVIDIA NSIGHT 进行了调试,其中整个立方体贴图纹理只显示了一个面部。

我阅读了数十个示例,这些示例展示了如何使用 gl_Layer id 通过几何着色器进行多目标渲染,但它们都以不同的方式进行。

例如,不清楚是否将立方体贴图纹理附加到 FBO 的单个渲染目标就足够了,还是每个面都必须附加到不同的渲染目标?

应该 glFramebufferTexture 用于绑定(bind)附件或 glFramebufferTexture2D ?

当立方体贴图附加到帧缓冲区时,glClearColor 应该将所有面清除为某种颜色还是仅清除第一种颜色?

我在这里想念什么?任何人都可以展示如何以正确的方式做到这一点?

系统规范:

显卡:NVIDIA GeForce 960 GTX
Windows7 64位
MSVC120

最佳答案

我无法证明这是问题所在。但这肯定是一个问题:

for(int i=0; i<4; i++)

你说你的GS拿 triangles作为输入。好吧,那些只有三个顶点,而不是 4 个。所以你的三角形带中会有一个坏顶点。

在 GS 中循环项目时,这样做总是更安全:
for(int i = 0; i < gl_in.length(); i++)

这样,如果您更改输入原始类型,您的长度会自动更新。

关于opengl - 使用几何着色器分层渲染到 CUBEMAP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33156254/

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