Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 正确使用GLTexImage3D的问题_C#_Opengl_Glsl_Opentk - Fatal编程技术网

C# 正确使用GLTexImage3D的问题

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,这就是我所期望的。所以我

这就是我给OpenGL位图的方法。(C#)

我找到了一个数据应该如何组织的描述,我解释为图像应该垂直排列,可能是翻转或其他什么

因此,在我的测试中,我使用了2幅图像,在片段着色器上,我应用纹理,如下所示:

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);