2017-05-27 5 views
1

私は、VB.NETのOpenGL 3.3(OpenTK)でテクスチャリングしようとしていました。 OutputOpenTK - GLSL - 別々に格納されたテクスチャ座標のBufferData

実際の画像は、次のとおりです:

Original image

コードは次のとおりです。

Imports OpenTK 
Imports OpenTK.Graphics.OpenGL 
Imports System.IO 
Imports System.Drawing.Imaging 

Public Class Form1 



    Private vertices() As Vector3 = {New Vector3(0.5F, 0.5F, 0.0F), 
            New Vector3(0.5F, -0.5F, 0.0F), 
            New Vector3(-0.5F, -0.5F, 0.0F), 
            New Vector3(-0.5F, 0.5F, 0.0F)} 

    Private texcoords() As Vector2 = {New Vector2(1.0F, 1.0F), 
            New Vector2(1.0F, 0.0F), 
            New Vector2(0.0F, 0.0F), 
            New Vector2(0.0F, 1.0F)} 

    Private indices() As UInteger = {0, 1, 3, 
            1, 2, 3} 

    Private VBO, VAO, EBO As Integer 

    Private vert_shader_source, frag_shader_source As String 
    Private vertex_shader, fragment_shader, shader_program As Integer 

    '-------------- 
    Private texture As Integer 
    Private texture_bmp As New Bitmap("Textures/tex4.jpg") 
    Private TBO As Integer 


    Private Sub load_texture(ByRef tex_bmp As Bitmap, ByRef texture_index As Integer) 

     GL.Enable(EnableCap.Texture2D) 

     GL.Hint(HintTarget.PerspectiveCorrectionHint, HintMode.Nicest) 

     GL.GenTextures(1, texture_index) 
     GL.BindTexture(TextureTarget.Texture2D, texture_index) 
     GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, CInt(TextureMinFilter.Linear)) 
     GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, CInt(TextureMagFilter.Linear)) 

     Dim data As BitmapData = tex_bmp.LockBits(New System.Drawing.Rectangle(0, 0, tex_bmp.Width, tex_bmp.Height), ImageLockMode.[ReadOnly], System.Drawing.Imaging.PixelFormat.Format32bppArgb) 

     GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, data.Width, data.Height, 0, 
    OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0) 

     tex_bmp.UnlockBits(data) 

    End Sub 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

     vert_shader_source = openShader("Shaders/vertex.glsl") 
     frag_shader_source = openShader("Shaders/fragment.glsl") 

     createShaders() 
     create_handles() 

     createVAO() 

     '--------------- 
     load_texture(texture_bmp, texture) 

    End Sub 

    Sub create_handles() 

     VAO = GL.GenVertexArray() 
     VBO = GL.GenBuffer() 
     EBO = GL.GenBuffer() 

     '------------- 
     TBO = GL.GenBuffer() 

    End Sub 

    Private Sub GlControl1_Load(sender As Object, e As EventArgs) Handles GlControl1.Load 

    End Sub 

    Sub copy_to_gpu() 

     GL.BindBuffer(BufferTarget.ArrayBuffer, VBO) 
     GL.BufferData(Of Vector3)(BufferTarget.ArrayBuffer, New IntPtr(vertices.Length * Vector3.SizeInBytes), 
            vertices, BufferUsageHint.StaticDraw) 

     GL.BindBuffer(BufferTarget.ElementArrayBuffer, EBO) 
     GL.BufferData(BufferTarget.ElementArrayBuffer, New IntPtr(indices.Length * Len(New UInteger)), 
            indices, BufferUsageHint.StaticDraw) 


     '----------- 
     GL.BindBuffer(BufferTarget.TextureBuffer, TBO) 
     GL.BufferData(Of Vector2)(BufferTarget.TextureBuffer, New IntPtr(texcoords.Length * Vector2.SizeInBytes), 
            texcoords, BufferUsageHint.StaticDraw) 

    End Sub 

    Sub link_vertex_attribs() 

     GL.EnableVertexAttribArray(0) 
     GL.BindBuffer(BufferTarget.ArrayBuffer, VBO) 
     GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, False, Vector3.SizeInBytes, 0) 

     '------------- 
     GL.EnableVertexAttribArray(1) 
     GL.BindBuffer(BufferTarget.TextureBuffer, TBO) 
     GL.VertexAttribPointer(1, 3, VertexAttribPointerType.Float, False, Vector3.SizeInBytes, 0) 

    End Sub 


    Sub createVAO() 

     GL.BindVertexArray(VAO) 

     copy_to_gpu() 
     link_vertex_attribs() 

     GL.BindBuffer(BufferTarget.ArrayBuffer, 0) 
     GL.BindVertexArray(0) 

    End Sub 

    Sub createShaders() 

     'vertex shader 
     vertex_shader = GL.CreateShader(ShaderType.VertexShader) 
     GL.ShaderSource(vertex_shader, vert_shader_source) 
     GL.CompileShader(vertex_shader) 

     'fragment shader 
     fragment_shader = GL.CreateShader(ShaderType.FragmentShader) 
     GL.ShaderSource(fragment_shader, frag_shader_source) 
     GL.CompileShader(fragment_shader) 

     'create shader program 
     shader_program = GL.CreateProgram() 


     'attach shader program 
     GL.AttachShader(shader_program, vertex_shader) 
     GL.AttachShader(shader_program, fragment_shader) 


     'link shader program 
     GL.LinkProgram(shader_program) 


     GL.DeleteShader(vertex_shader) 
     GL.DeleteShader(fragment_shader) 

    End Sub 

    Function openShader(location As String) As String 

     Dim ret As String = "" 

     Try 
      ' Open the file using a stream reader. 
      Using sr As New StreamReader(location) 
       Dim line As String 
       ' Read the stream to a string and write the string to the console. 
       line = sr.ReadToEnd() 

       ret &= line 
      End Using 
     Catch e As Exception 
      MsgBox("Error Opening shader", MsgBoxStyle.Critical, "Error") 
      Me.Close() 
     End Try 

     Return ret 

    End Function 

    Private Sub GlControl1_Paint(sender As Object, e As PaintEventArgs) Handles GlControl1.Paint 

     GL.ClearColor(0.2F, 0.3F, 0.3F, 1.0F) 
     GL.Clear(ClearBufferMask.ColorBufferBit) 

     GL.UseProgram(shader_program) 

     '''''''' 

     GL.ActiveTexture(TextureUnit.Texture0) 
     GL.BindTexture(TextureTarget.Texture2D, texture) 
     GL.Uniform1(GL.GetUniformLocation(shader_program, "ourTexture"), 0) 

     '''''''' 

     GL.BindVertexArray(VAO) 

     GL.DrawElements(BeginMode.Triangles, 6, DrawElementsType.UnsignedInt, 0) 
     GL.BindVertexArray(0) 

     GlControl1.SwapBuffers() 


    End Sub 

    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing 

     GL.DeleteVertexArray(VAO) 
     GL.DeleteBuffer(VBO) 
     GL.DeleteBuffer(EBO) 

     GL.DeleteTexture(texture) 

    End Sub 
End Class 
しかし、私はクワッドにテクスチャをマッピングしようとすると、次の出力が得られ奇妙な問題に出くわしました

私は、頂点データとテクスチャ座標を別々に保存していますが、BufferDataを使用してGPUを個別にバッファリングしようとしています。

問題は、BufferDataが正常に動作していない可能性があります。テクスチャ座標にどのような値を割り当てても、出力には影響しません!私はこれにフラグメントシェーダを微調整する場合は、しかし

#version 330 core 

out vec4 color; 

in vec2 TexCoord; 
uniform sampler2D ourTexture; 

void main() 
{ 
    color = texture(ourTexture, TexCoord); 
} 

#version 330 core 

layout (location = 0) in vec3 position; 
layout (location = 1) in vec2 texCoord; 

out vec2 TexCoord; 

void main() 
{ 
    gl_Position = vec4(position.x, position.y, position.z, 1.0); 

    TexCoord = texCoord; 
} 

フラグメントシェーダ:ここ

が頂点シェーダである

color = texture(ourTexture, vec2(TexCoord.x-1.0f,1.0f-TexCoord.y)); 

は、それが動作します..しかし、テクスチャの座標は出力に影響を与えていないようです。

答えて

1

1)テクスチャ座標を格納するバッファは、テクスチャバッファではありませんここで間違って行くのがいくつかあります。テクスチャバッファは、テクスチャ座標を格納するのではなく、テクスチャのデータを扱うために使用されます。テクスチャ座標は、位置、色などと同様の属性であり、GL_ARRAY_BUFFERに格納する必要があります。

2)属性の入力としてテクスチャバッファを使用することはできないため、VertexAttribPointerへの2回目の呼び出しでも位置(テクスチャ座標は-0.5から0.5)の位置vboが使用されます。テクスチャ座標vboをGL_ARRAY_BUFFERにバインドします。

3)データをアップロードするときには2次元ベクトルを使用しますが、VertexAttribPointer呼び出しでは、データが3Dベクトルで構成されていることをOpenGLに伝えます。正しいコードは次のようになります:

GL.VertexAttribPointer(1, 2, VertexAttribPointerType.Float, False, Vector2.SizeInBytes, 0) 
+0

この3番目の部分について:私も同じことを思っていました。 GL.VertexAttribPointer(1、2、VertexAttribPointerType.Float、False、Vector2.SizeInBytes、0) 私に変形出力を与えました –

+0

はい、うまくいきました。ありがとう。その間違った属性タイプのため、vector3に設定されたストライドは前回は機能しませんでした... –

関連する問題