背景图片重复

时间:2016-06-23 23:39:29

标签: vb.net opengl

我想在场景中绘制对象之前显示背景图像。当我的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

1 个答案:

答案 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()

干杯。