c++ - 写入纹理 GLSL

标签 c++ opengl glsl texture-mapping render-to-texture

我希望能够(在片段着色器中)将一个纹理添加到另一个纹理。现在我有投影纹理并想扩展它。

这是我目前所拥有的:

我还绘制了视锥体,蓝色/灰色测试图像沿着该视锥体被投影到不断旋转的几何体上。

我的顶点着色器:

    ProjTexCoord = ProjectorMatrix * ModelTransform * raw_pos;

我的片段着色器:

vec4 diffuse = texture(texture1, vs_st);
vec4 projTexColor = textureProj(texture2, ProjTexCoord);
vec4 shaded = diffuse; // max(intensity * diffuse, ambient); -- no shadows for now
    if (ProjTexCoord[0] > 0.0 || 
        ProjTexCoord[1] > 0.0 ||
        ProjTexCoord[0] < ProjTexCoord[2] || 
        ProjTexCoord[1] < ProjTexCoord[2]){
        diffuse = shaded;
    }else if(dot(n, projector_aim) < 0 ){
        diffuse = projTexColor;
    }else{
        diffuse = shaded;
    }

我想要实现的目标:

例如,当用户按下按钮时,我希望将蓝色/灰色纹理写入球体上的灰色纹理并随其旋转。将其想象成某种“拍照”或在球体顶部绘画,以便在按下按钮后蓝色/灰色纹理与球体一起旋转。

由于片段着色器对每个像素进行操作,因此应该可以逐个像素地从一个纹理复制到另一个纹理,但我不知道如何,我可能在谷歌上搜索了错误的东西。

我怎样才能在技术上做到这一点?什么方法最通用?非常感谢建议,如果需要更多代码,请告诉我。

最佳答案

需要说明的是,您想将贴花烘焙到球体的灰色纹理中。

在绘制另一个对象时写入灰色纹理的问题在于它不是一对一的。您可能会向同一个纹理元素写入两次或更多次,或者单个片段可能需要写入灰色纹理中的许多纹理元素。这听起来可能很有吸引力,因为您已经在一个地方获得了所有内容的坐标,但我不会这样做。

我首先创建一个纹理,其中包含灰色纹理中每个纹素的对象空间位置。这是关键,因此当您单击时可以渲染到灰色纹理(使用 FBO)并知道每个纹素在当前 View 或投影纹理 View 中的位置。可能存在相同的纹理位出现在多个三角形上的边缘情况。您可以通过使用纹理坐标作为顶点位置将球体渲染为灰色纹理来实现。为此,您可能需要一个浮点纹理,下图可能不是球体的纹理映射,但它可以用于演示 :P。

enter image description here

因此,当您单击时,您会在启用 alpha 混合的情况下将全屏四边形渲染到灰色纹理。使用灰色纹理对象空间位置,每个片段计算蓝色纹理投影内的图像空间位置。丢弃纹理外部的碎片,并在内部的碎片中采样/混合。

enter image description here

关于c++ - 写入纹理 GLSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27115456/

相关文章:

opengl - 如何提高我的阴影质量?

opengl-es - 如何在不改变 glsl 中大小的情况下对 sdf 进行圆角处理

c++ - 什么是客户端证书以及从哪里获取它,如何使用它连接到服务器?

c++ - 如何在 gdb 中为 C++ 对象的所有构造函数同时设置断点?

c++ - 共享内存初始化和访问

opengl - 将着色器应用于帧缓冲区对象以获得鱼眼效果

c++ - Qt3D 从 QGeometry 读取原始顶点数据

opengl - 使用 1D 纹理缓冲区时 GLSL 的意外结果

c++ - 使用 wprintf 打印 opengl 着色器编译日志

c++ - 使用用户输入的字符创建梯形。 (控制台应用程序)