我想在场景中绘制对象之前显示背景图像。当我的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
我设置背景图片的代码。仅供参考,我在网上得到了这个。我不是100%在这里发生的事情。
' 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
答案 0 :(得分:1)
我想我理解这个问题。解决方案很简单。
首先请注意,无论视口或纹理图像尺寸如何,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()
干杯。