2016-06-23 187 views
0

我想在場景中繪製對象之前顯示背景圖像。當我的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 
+1

你是如何繪製背景的?你把它渲染在四邊形上?你有沒有定義這個quad的uv座標? – Zouch

回答

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

乾杯。

+0

然而,這是有道理的,我改變了我的代碼,並沒有任何不同。它仍然(固執地)呈現相同的重複紋理。順便說一句,我改變了xMax,yMax爲1.0,1.0 - 你有1.0,0.0。此外,我將TexCoord2座標更改爲幾個不同的值以查看效果,並且每次都以相同的方式呈現完全相同的背景圖像。任何其他建議?我都是耳朵。 – twegner

+0

只是要清楚你正在改變你的正交矩陣,而不是(0,0,w,h)的gl視口正確嗎?其可能的問題是你的代碼中的其他地方。如果改變tex coords並沒有什麼區別,那麼它不是你在輸出中看到的quad。 – Harish

+0

我不知道這是否是這樣...我在我的家用電腦上也有類似的程序出現相同的問題。再次,我用你的建議,但是,這次我使用整數不漂浮(無小數)和IT工作!我不認爲小數點會成爲問題。我必須在我的工作機器上再試一次,但這可能是我尋找的答案。 – twegner