我需要将立方体映射的特定面渲染为四边形以进行调试。
从这个类似的问题中,我收集到您使用三维纹理坐标,但是我需要一些信息来克服这一障碍。我现在所得到的只是黑色,有时甚至是完全不同的颜色。
到目前为止,我已经使用以下内容绘制了二维四边形。
GL.ActiveTexture(TextureUnit.Texture0);
GL.BindTexture(TextureTarget.Texture2D, textureID);
GL.BindVertexArray(VAO);
GL.DrawArrays(PrimitiveType.Triangles, 0, vertices.Length);
我需要在这里进行调整吗?这样做的一般方法是什么?
需要进行一些更改,这些更改都非常简单。
当前使用的位置TextureTarget.Texture2D
,您将TextureTarget.TextureCubeMap
改为使用。例如,假设您已经具有给定的多维数据集贴图纹理:
GL.BindTexture(TextureTarget.TextureCubeMap, textureID);
在片段着色器中,当前定义了一个sampler变量,该变量看起来像这样:
uniform sampler2D Tex;
您将其修改为:
uniform samplerCube Tex;
最大的变化与您的纹理坐标有关。用于多维数据集贴图的纹理坐标将包含3个分量,可以将其解释为方向向量。绘制与以原点为中心的多维数据集贴图相对应的多维数据集。然后,由纹理坐标给出的方向向量指向将要采样的纹理像素。
一种选择是修改由客户代码产生的顶点属性中的纹理坐标。您可以将它们扩展到3个组件,而不是以前的2个,并选择适当的值以隔离要渲染的面。
与其这样做,不如根据您已经传递给2D纹理的着色器代码的现有纹理坐标来计算新的纹理坐标,可能要容易得多。当前纹理坐标在两个坐标方向上都跨度为[0.0,1.0]的正方形时,您需要将该范围映射到多维数据集的面,其中多维数据集以原点为中心,并且扩展区为[-1.0,1.0 ]在每个坐标方向上。
为此,请使用-1.0或1.0作为与您要隔离的面部相匹配的坐标方向,然后将其他两个坐标的输入纹理坐标从[0.0,1.0]范围缩放/移动到[-1.0,1.0]范围指示。
假设您在2D纹理案例的着色器代码中具有以下内容:
uniform sampler2D Tex;
in vec2 TexCoord;
...
vec4 val = texture(Tex, TexCoord);
然后,对于GL_TEXTURE_CUBE_MAP_POSITIVE_X
脸部,使用1.0作为立方体纹理坐标的x坐标,并缩放/移动其余两个坐标:
uniform samplerCube Tex;
in vec2 TexCoord;
...
vec2 mapCoord = 2.0 * TexCoord - 1.0;
vec4 val = texture(Tex, vec3(1.0, mapCoord.xy));
GL_TEXTURE_CUBE_MAP_NEGATIVE_X
脸部等效:
vec4 val = texture(Tex, vec3(-1.0, mapCoord.xy));
对于GL_TEXTURE_CUBE_MAP_POSITIVE_Y
脸:
vec4 val = texture(Tex, vec3(mapCoord.x, 1.0, mapCoord.y));
对于GL_TEXTURE_CUBE_MAP_NEGATIVE_Y
脸:
vec4 val = texture(Tex, vec3(mapCoord.x, -1.0, mapCoord.y));
对于GL_TEXTURE_CUBE_MAP_POSITIVE_Z
脸:
vec4 val = texture(Tex, vec3(mapCoord.xy, 1.0));
对于GL_TEXTURE_CUBE_MAP_NEGATIVE_Z
脸:
vec4 val = texture(Tex, vec3(mapCoord.xy, -1.0));
请注意,立方体贴图面的方向有点模棱两可。如果您对结果输出的方向有特定的期望,则可能必须置换/镜像上面代码中的某些值。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句