当前位置: 首页 > 知识库问答 >
问题:

OpenGL可编辑纹理

商飞翮
2023-03-14

我正在尝试利用gpu的并行性来制作图像处理应用程序。我有一个着色器,它采用两种纹理,并基于一些统一的变量计算输出纹理。但是不是透明度alpha值,每个纹理像素需要一个额外的元数据字节,这在计算中是强制性的:

因此,我考虑每帧运行着色器两次,一次将动态元数据计算为单字节纹理,一次计算生成的Paint Texture,我需要3个字节(以限制内存使用,因为可能有相当多这样的纹理一次加载)。

我发现上面的问题有点复杂,我用opengl在屏幕上画画,但这次我需要画两种不同的纹理,我不知道怎么做。此外,gl_FragColor内置变量的类型是vec4,但我需要不同的输出值。

  • 总之,片段着色器是否可以输出vec4以外的任何东西

通过在cpu上快速切换纹理,可以很容易地完成上述操作。我可以将所有相关数据保存在cpu上,以每秒60次的速度完成所有工作,并通过将数据从cpu传递到gpu来更新相关纹理。对于每帧改变相对较小的纹理区域(约占512x512大小纹理总比例的20%),您认为上述方法值得费心吗?

共有1个答案

徐俊人
2023-03-14

这取决于您使用的OpenGL版本。

最新的OpenGL 4没有gl_FragColor变量,而是允许您从片段着色器写入任意数量(最多支持的最大值)的输出颜色,每个颜色都发送到相应的帧缓冲区颜色附件:

layout(location = 0) out vec4 OUT0;
layout(location = 1) out float OUT1;

OUT0写入当前绑定帧缓冲区的GL_COLOR\u ATTACHMENT0OUT1GL_COLOR\u attachment1

然而,考虑到您使用的是gl_FragColor,所以您使用的是一些旧版本的OpenGL。我不熟悉旧版OpenGL,但您可以查看您的实现是否支持GL_ARB_draw_buffers扩展和/或GL_FragData[]输出变量。

此外,如上所述,尚不清楚为什么不能使用单个RGBA纹理并使用其alpha通道来获取元数据。

 类似资料:
  • 我有一个用于OpenGL中模型渲染的纹理数组。此数组包含漫反射和镜面纹理。由于某些网格没有镜面纹理,因此我在每次渲染后简单地将NULL纹理绑定到我的镜面采样器,并且只有当网格具有镜面纹理时,我才绑定一个。但是,我仍然在没有镜面纹理的网格上看到镜面纹理。 这是我的渲染代码 材质索引保存数组中纹理的索引,如果网格没有镜面纹理 索引为-1 纹理单元0用于漫反射 纹理单元2用于镜面

  • 所以最近我开始阅读OpenGL维基文章。这就是我在这里描述OpenGL纹理的方式。不过,有几点尚不清楚。 以下陈述是真的、假的还是视情况而定? 将两个纹理绑定到同一个纹理单元是不可能的。 将两个采样器绑定到同一个纹理单元是不可能的。 将一个纹理绑定到两个不同的纹理单元是不可能的。 将一个采样器绑定到两个不同的纹理单元是不可能的。 应用程序有责任明确将什么采样器类型传递给什么统一变量。 着色器程序有

  • “我在我的申请中发现了一个奇怪的行为,希望你能解释给我听。”。你看,我有两个3D纹理,它们被发送到片段着色器,渲染得非常好。但有一个问题,当我创建另一个纹理(它是1D纹理)时,一个黑屏正在被渲染,而不是正确的前一个结果。 关于这个1D纹理,我甚至没有将其发送到片段着色器。当我调用glTexImage1D(…)时,黑屏就出现了。我评论这句话,它就消失了!!这两种纹理被渲染。 我觉得纹理单位肯定有问题

  • 在andrid上的opengl es中,当我将两个纹理相邻放置时,会有一个轻微的接缝,可以看到它们后面绘制的对象。基本上看起来是一个小差距。我把范围缩小到了地图上 glTexParameteri(GL_纹理_2D、GL_纹理_最小过滤器、GL_线性_MIPMAP_线性);glTexParameteri(GL_纹理_2D、GL_纹理_MAG_过滤器、GL_线性); 如果我将它们都设置为距接缝最近的G

  • 假设我有一个金字塔…我知道如何绘制它,我知道如何为整个金字塔设置纹理,但如何为每面墙设置不同的纹理? 我通过在 我试图通过添加<code>GL11.glBindTexture(GL11.GL_TEXTURE_2D,TEXTURE.getTextureID())来绑定纹理 后,但

  • 可以使用 Photoshop 的绘画工具和调整工具来编辑 3D 文件中包含的纹理,或创建新纹理。纹理作为 2D 文件与 3D 模型一起导入。它们会作为条目显示在“图层”面板中,嵌套于 3D 图层下方,并按以下映射类型编组:散射、凹凸、光泽度,等等。 注意:要查看特定纹理文件的缩览图,请将鼠标指针悬停在“图层”面板中的纹理名称上。也会显示图像大小和颜色模式。 “图层”面板显示 3D 纹理,并按纹理映