首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >背景图像重复

背景图像重复
EN

Stack Overflow用户
提问于 2016-06-23 23:39:28
回答 1查看 451关注 0票数 0

在绘制场景中的物体之前,我想先显示一个背景图像。当我的opengl窗口加载时,它会显示背景图像重复出现。我做了一些测试,如果我保持我的视口X,Y维在0和1,那么背景图像是正确的显示。

代码语言:javascript
复制
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,以适应所有的顶点.

代码语言:javascript
复制
    _vXmin = 0
    _vXmax = 2000
    _vYmin = 0
    _vYmax = 2000
    _vZmin = -1
    _vZmax = 1

因此,背景图像被重复,因为它想保持0->1。有什么方法吗?还是从根本上说,我通过将视口更改为大于1来绘制对象是错误的呢?我是否需要改变我的所有顶点,使其活在-1到1之间?

编辑#1

我的设置背景图像的代码。我在网上查到的。我不是百分之百地了解这里发生的事情。

代码语言:javascript
复制
' 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

最后,我的代码渲染背景图像。

代码语言:javascript
复制
' 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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-29 04:54:51

我想我理解这个问题。解决办法很简单。

首先,注意OpenGL中的纹理大小是(0.0,0.0)到(1.0,1.0),而不考虑视口或纹理图像维数。由于您正在绘制一个四角体,这里是它如何工作的一个例子。

代码语言:javascript
复制
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次。玩范围,你就会明白它是如何工作的。

因此,如果您希望您的纹理跨越整个视图一次,下面是您的代码的修改版本。

代码语言:javascript
复制
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()

干杯。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38003540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档