【问题标题】:Why does a texture in OpenTK not show properly? (Wrong colors/Rotated)为什么 OpenGL 中的纹理不能正确显示? (颜色错误/旋转)
【发布时间】:2019-07-25 13:05:41
【问题描述】:

我已经列出了我自己的纹理对象,以便我可以相应地访问它们。这是我正在使用的两个位图图像:

每次我加载我的程序时,它都会从两个位图文件中读取并将它们的纹理数据存储到我的全局纹理列表中。首先加载草瓦,然后加载带有1.0 的棋盘。草瓷砖纹理渲染。这是它在我的程序中的样子:

它看起来好像旋转了 180 度并水平翻转。我检查了我的 2d 投影、坐标,它们没问题。向上朝向正 Y,向右朝向正 X,这很好。还有,颜色还行,质感不错!

但是,如果我选择渲染第二个纹理,即黑色/洋红色棋盘格,它在我的程序中看起来像这样:

它也被旋转和翻转,但颜色也没有被正确渲染。为什么会这样?这是我的代码:

从位图加载纹理:

Private Function LoadFromBitmap(ByVal Bitmap As Bitmap) As Integer

    Dim Tex As Integer
    GL.Hint(HintTarget.PerspectiveCorrectionHint, HintMode.Nicest)

    GL.GenTextures(1, Tex)
    GL.BindTexture(TextureTarget.Texture2D, Tex)

    Dim Data As BitmapData = Bitmap.LockBits(New Rectangle(0, 0, Bitmap.Width, Bitmap.Height), ImageLockMode.ReadOnly, Imaging.PixelFormat.Format32bppArgb)
    GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, Data.Width, Data.Height, 0, OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, Data.Scan0)
    Bitmap.UnlockBits(Data)

    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, TextureMagFilter.Nearest)
    GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, TextureMinFilter.Nearest)

    Return Tex
End Function

渲染:

GL.MatrixMode(MatrixMode.Modelview)
GL.LoadIdentity()

GL.Viewport(0, 0, ControlWidth, ControlHeight)

For X As Byte = 0 To EZSize(0) - 1

    For Y As Byte = 0 To EZSize(1) - 1

        GL.Enable(EnableCap.Texture2D)

        GL.BindTexture(TextureTarget.Texture2D, TextureList.Item(1).IntData)

        GL.Begin(PrimitiveType.Quads)

        GL.TexCoord2(X, Y) : GL.Vertex2(X, Y)
        GL.TexCoord2(X + 1, Y) : GL.Vertex2(X + 1, Y)
        GL.TexCoord2(X + 1, Y + 1) : GL.Vertex2(X + 1, Y + 1)
        GL.TexCoord2(X, Y + 1) : GL.Vertex2(X, Y + 1)

        GL.End()

        GL.Disable(EnableCap.Texture2D)
    Next
Next

GL.LoadIdentity()
GL.Flush()

GraphicsContext.CurrentContext.SwapInterval = True
GlControl1.SwapBuffers()

【问题讨论】:

    标签: vb.net textures opentk


    【解决方案1】:

    如果启用纹理,则默认情况下纹理元素的颜色乘以当前颜色,因为默认情况下纹理环境模式 (GL_TEXTURE_ENV_MODE) 为GL_MODULATE。见glTexEnv

    这会导致纹理纹素的颜色与您在glColor 设置的最后一种颜色“混合”。

    在渲染纹理之前设置“白色”颜色,以解决您的问题:

    GL.Color3(Color.White)
    

    纹理是翻转的,因为左下窗口坐标是(0,0),但是在纹理中右上坐标是(0, 0)。您必须通过翻转纹理坐标的 v 分量来补偿这一点:

    例如:

    GL.Enable(EnableCap.Texture2D)
    GL.BindTexture(TextureTarget.Texture2D, TextureList.Item(1).IntData)
    
    GL.Color3(Color.White)
    
    GL.Begin(PrimitiveType.Quads)
    
    GL.TexCoord2(X,     Y + 1)  : GL.Vertex2(X,     Y)
    GL.TexCoord2(X + 1, Y + 1)  : GL.Vertex2(X + 1, Y)
    GL.TexCoord2(X + 1, Y)      : GL.Vertex2(X + 1, Y + 1)
    GL.TexCoord2(X,     Y)      : GL.Vertex2(X,     Y + 1)
    
    GL.End()
    
    GL.Disable(EnableCap.Texture2D)
    

    同样,您可以将环境模式更改为GL_REPLACE,而不是glTexEnv

    GL.TexEnv(TextureEnvTarget.TextureEnv, TextureEnvParameter.TextureEnvMode, GL_REPLACE)
    

    【讨论】:

    • 这固定了颜色,但为什么它会旋转和翻转?另外,与GL.TexEnv 中的第三个参数(它需要Color 对象)的第三个参数等效的确切VB.Net 是什么?我在哪里放置该函数?
    • @wEight 你必须翻转纹理坐标的 v 分量。我已经扩展了答案。
    • 哦,这很有道理!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    相关资源
    最近更新 更多