Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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# OpenGl纹理问题_C#_Opengl_Textures - Fatal编程技术网

C# OpenGl纹理问题

C# OpenGl纹理问题,c#,opengl,textures,C#,Opengl,Textures,纹理头痛… 我不明白我哪里出错了。我的问题是纹理没有对齐。左侧的图像是OpenGl纹理四边形,右侧是原始图像。请注意,柱在带纹理的四边形中是如何偏移的 我不知道我是否没有正确加载纹理,或者在上传到videomemory时出错,或者只是使用了错误的texCoords 图像是一个bmp(R8 G8 B8 A8),错误就在这里: (加载位图并上载纹理) (四合院…) 有人发现了导致这种情况的原因吗?你的问题是你的glTexCoord坐标。如果你这样做 Gl.glTexCoord2f(0f,

纹理头痛…

我不明白我哪里出错了。我的问题是纹理没有对齐。左侧的图像是OpenGl纹理四边形,右侧是原始图像。请注意,柱在带纹理的四边形中是如何偏移的

我不知道我是否没有正确加载纹理,或者在上传到videomemory时出错,或者只是使用了错误的texCoords

图像是一个bmp(R8 G8 B8 A8),错误就在这里:

(加载位图并上载纹理)

(四合院…)


有人发现了导致这种情况的原因吗?

你的问题是你的glTexCoord坐标。如果你这样做

    Gl.glTexCoord2f(0f, 0f);
    Gl.glVertex2i(50, 50);

    Gl.glTexCoord2f(0f, 1f); 
    Gl.glVertex2i(50, this.Height - 50);

    Gl.glTexCoord2f(1f, 1f); 
    Gl.glVertex2i(this.Width - 50, this.Height - 50);

    Gl.glTexCoord2f(1f, 0f); 
    Gl.glVertex2i(this.Width - 50, 50);
,例如,它应该为您提供对齐的定位。纹理坐标从0到1。如果在我的示例中将1更改为2,则纹理将在每个方向重复两次,从而在该四边形上提供四个副本

请注意,这是未经测试的代码,我可能有错误的纹理坐标顺序,但关键是您不应该使用像素尺寸,而是应该将纹理尺寸参数化为[0,1]比例

原因是纹理参数设置为“包裹”。取0表示纹理的开始,1表示它的维数的100%,如果你指定了一些非整数,那么它将在你的纹理中间开始或结束,而任何非零整数都是你的纹理大小的倍数,所以它会出现重复。p> 编辑: 这也是获得我所说的效果所必需的,以替换GL_纹理和GL_纹理的设置

    Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
    Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);

问题不在于纹理坐标

问题是你加载的纹理是错误的。您忘了删除位图标题,因此所有真实数据都被移过,并且每行的结尾都被移到下一行的开头


纹理换行会将像素从右向后换行到同一条线上,但不合适的区域会下移一行。在您启用的“钳制到边”模式下,纹理环绕也不会发生。

好吧,坐标钳制到0f和1f时看起来是一样的。我添加了0.5像素来采样纹理的中心,以避免模糊。这应该是正确的,我懂了。这是什么?高度和宽度?你可能将纹理正确地应用到了错误的四边形坐标。这是我正在绘制的控件的宽度和高度。啊!哼!完全有道理!从你的头顶开始,我如何在没有标题的情况下将bmp放入字节数组?@mickey:我通常使用GDI+加载图像,这样就支持许多压缩格式。然后返回值中的
BitmapData.Scan0
glTexImage2D
需要的指针。或者我使用二进制PBM/PGM格式,它有一个非常简单的头,然后是OpenGL所期望的格式的数据。一般来说,BMP文件可以被压缩,OpenGL不能直接使用。现在我将使用lockbits方法。谢谢你抓住了这个错误,还有提示,本!不过有一个问题。图中的标题在哪里?难道它不应该被视为垃圾吗?@mickey:我真的说不出来,你们可能在切掉一排纹理。要实现像素完美对齐,您可能需要将四边形坐标调整1/2像素,而不是纹理坐标。另外,你正在加载一个alpha通道。。。标题可能最终大部分是透明的。
    Gl.glTexCoord2f(0f, 0f);
    Gl.glVertex2i(50, 50);

    Gl.glTexCoord2f(0f, 1f); 
    Gl.glVertex2i(50, this.Height - 50);

    Gl.glTexCoord2f(1f, 1f); 
    Gl.glVertex2i(this.Width - 50, this.Height - 50);

    Gl.glTexCoord2f(1f, 0f); 
    Gl.glVertex2i(this.Width - 50, 50);
    Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
    Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);