我希望能够(在片段着色器中)将一种纹理添加到另一种。现在,我具有投影纹理,并希望对此进行扩展。

这是我到目前为止的内容:
c++ - 写入纹理GLSL-LMLPHP

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

我的顶点着色器:

    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。

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

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

10-11 23:08
查看更多