在绘制场景中的物体之前,我想先显示一个背景图像。当我的opengl窗口加载时,它会显示背景图像重复出现。我做了一些测试,如果我保持我的视口X,Y维在0和1,那么背景图像是正确的显示。
Private _vXmin As Double = 0
Private _vXmax As Double = 1
Private _vYmin As Double = 0
Private _vYmax As Double = 1
Private _vZmin As Double = 0
Private _vZmax As Double = 1
Private Sub SetupViewport()
Dim w As Integer = Me.Width
Dim h As Integer = Me.Height
GL.MatrixMode(MatrixMode.Projection)
GL.LoadIdentity()
GL.Ortho(_vXmin, _vXmax, _vYmin, _vYmax, _vZmin, _vZmax)
GL.Viewport(0, 0, w, h)
End Sub问题是我的绘图对象在这个狭小的视图空间之外。所以我调整了视口的大小,使之更接近0->2000,以适应所有的顶点.
_vXmin = 0
_vXmax = 2000
_vYmin = 0
_vYmax = 2000
_vZmin = -1
_vZmax = 1因此,背景图像被重复,因为它想保持0->1。有什么方法吗?还是从根本上说,我通过将视口更改为大于1来绘制对象是错误的呢?我是否需要改变我的所有顶点,使其活在-1到1之间?
编辑#1
我的设置背景图像的代码。我在网上查到的。我不是百分之百地了解这里发生的事情。
' Set Background Image
Private Function SET_BACKGROUND_IMG() As Integer
Dim myImg As String = "C:\Users\00835182\Documents\Programs\OpenGL\_background_color.jpg"
Dim id As Integer = GL.GenTexture
GL.BindTexture(TextureTarget.Texture2D, id)
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, TextureMinFilter.Linear)
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, TextureMagFilter.Linear)
Dim bmp = New Bitmap(myImg)
Dim bmp_data As BitmapData = bmp.LockBits(New Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, Imaging.PixelFormat.Format32bppArgb)
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, bmp_data.Width, bmp_data.Height, 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, bmp_data.Scan0)
bmp.UnlockBits(bmp_data)
Return id
End Function最后,我的代码渲染背景图像。
' Render Background
Private Sub RENDER_BACKGROUND()
GL.Enable(EnableCap.Texture2D)
GL.BindTexture(TextureTarget.Texture2D, _img)
GL.Begin(PrimitiveType.Quads)
GL.TexCoord2(_vXmin, _vYmin)
GL.Vertex2(_vXmin, _vYmin)
GL.TexCoord2(_vXmax, _vYmin)
GL.Vertex2(_vXmax, _vYmin)
GL.TexCoord2(_vXmax, _vYmax)
GL.Vertex2(_vXmax, _vYmax)
GL.TexCoord2(_vXmin, _vYmax)
GL.Vertex2(_vXmin, _vYmax)
GL.End()
GL.BindTexture(TextureTarget.Texture2D, 0)
GL.Disable(EnableCap.Texture2D)
End Sub发布于 2016-06-29 04:54:51
我想我理解这个问题。解决办法很简单。
首先,注意OpenGL中的纹理大小是(0.0,0.0)到(1.0,1.0),而不考虑视口或纹理图像维数。由于您正在绘制一个四角体,这里是它如何工作的一个例子。
Texture coords : Output
(0.0, 0.0) - (1.0, 1.0) : texture spans across the whole quad once.
(0.0, 0.0) - (2.0, 2.0) : texture spans in a 2/2 grid across the quad.因此,超过1.0的纹理将重复其自身。您也可以使用0.5只使用一半的纹理。或3.0在一个维度中重复纹理3次。玩范围,你就会明白它是如何工作的。
因此,如果您希望您的纹理跨越整个视图一次,下面是您的代码的修改版本。
GL.Begin(PrimitiveType.Quads)
GL.TexCoord2d(0.0, 0.0)
GL.Vertex2(_vXmin, _vYmin)
GL.TexCoord2d(1.0, 0.0)
GL.Vertex2(_vXmax, _vYmin)
GL.TexCoord2d(1.0, 1.0)
GL.Vertex2(_vXmax, _vYmax)
GL.TexCoord2d(0.0, 1.0)
GL.Vertex2(_vXmin, _vYmax)
GL.End()干杯。
https://stackoverflow.com/questions/38003540
复制相似问题