C# 正确使用GLTexImage3D的问题
这就是我给OpenGL位图的方法。(C#) 我找到了一个数据应该如何组织的描述,我解释为图像应该垂直排列,可能是翻转或其他什么 因此,在我的测试中,我使用了2幅图像,在片段着色器上,我应用纹理,如下所示:C# 正确使用GLTexImage3D的问题,c#,opengl,glsl,opentk,C#,Opengl,Glsl,Opentk,这就是我给OpenGL位图的方法。(C#) 我找到了一个数据应该如何组织的描述,我解释为图像应该垂直排列,可能是翻转或其他什么 因此,在我的测试中,我使用了2幅图像,在片段着色器上,我应用纹理,如下所示: void main() { outputColor = texture3D(ThreeDTexture,vec3(texcoord.x, 1.0 - texcoord.y, 0)); } 结果是两幅图像以大致相等的比例合并。如果我使用vec3.z参数0.5,这就是我所期望的。所以我
void main()
{
outputColor = texture3D(ThreeDTexture,vec3(texcoord.x, 1.0 - texcoord.y, 0));
}
结果是两幅图像以大致相等的比例合并。如果我使用vec3.z
参数0.5
,这就是我所期望的。所以我尝试了三张图片。它给出了所提供的第一个和最后一个图像的50-50组合(?!?!)。这是它的行为,不考虑我给vec3.z
的值
我希望该参数是所提供图像的Z轴。或者如果我使用整数作为所提供图像数组的索引
编辑:它是索引,但投影在0到1的范围内,就像x、y坐标一样
我哪里出错了
我给OpenGL的东西(顺序):
结果是:
EDIT:正如Rabbi76所解释的,解决方案是在调用GL.TexImage3D
后插入它:
GL.TexParameter(TextureTarget.Texture3D, TextureParameterName.TextureWrapS, (int)TextureParameterName.ClampToEdge);
GL.TexParameter(TextureTarget.Texture3D, TextureParameterName.TextureWrapT, (int)TextureParameterName.ClampToEdge);
GL.TexParameter(TextureTarget.Texture3D, TextureParameterName.TextureWrapR, (int)TextureParameterName.ClampToEdge);
默认情况下,纹理包裹参数
GL\u texture\u wrap\S
、GL\u texture\u wrap\T
和GL\u texture\u wrap\R
为GL\u REPEAT
缩小功能(GL\u纹理\u最小\u过滤器
)和放大功能(GL\u纹理\u图像过滤器
)的默认参数分别为GL\u最近的MIPMAP\u线性
)
看
如果传递给查找函数的纹理坐标参数为0.0,则“重复”和“线性”的组合会导致第一个体素与行、列或深度层的最后一个体素混合(插值)
如果要使用“包裹”参数“GL_夹紧到_边”,则第一个体素和最后一个体素不会混合,因为纹理坐标已夹紧
注意,第一个体素(或texel)的纹理坐标是
1/(2*N)
,最后一个体素的坐标是1-1/(2*N)
,其中N
是行、列或层中的体素数。因为坐标0正好在第一个和最后一个体素的中间。code>GL\u REPEAT将坐标0.0夹紧到1/(2*N)
完全正确。在问题中添加了等效的openTK代码。谢谢
GL.TexParameter(TextureTarget.Texture3D, TextureParameterName.TextureWrapS, (int)TextureParameterName.ClampToEdge);
GL.TexParameter(TextureTarget.Texture3D, TextureParameterName.TextureWrapT, (int)TextureParameterName.ClampToEdge);
GL.TexParameter(TextureTarget.Texture3D, TextureParameterName.TextureWrapR, (int)TextureParameterName.ClampToEdge);