2017-05-02 7 views
0

gl.Vertex 대신 VBO 버퍼를 사용하여 모델을 그리는 애플리케이션을 만들고 있습니다. 내가 그려야하는 평행 육면체는 정확하게 그려지지만 텍스처는 그려지지 않습니다. 내가 찾은 한 시간의 검색 결과, 법선과 정점을 추가해야합니다. 그러나 나는 그들을 어떻게 얻을 수 있습니까?VBO를 통해 드로잉 할 때 Tao.OpenGL에서 텍스처링

내 변수 :

 static float x = 0; 
    static float y = 0; 
    static float z = 0; 
    static float width = 10; 
    static float height = 5; 
    static float depth = 3; 
    float[] points = new float[72] {x, y, z , x + width, y, z , x + width, y - height, z , x, y - height, z , x, y, z + depth , x + width, y, z + depth, 
      x + width, y - height, z + depth , x, y - height, z + depth , x, y, z , x, y, z + depth , x, y - height, z + depth , x, y - height, z, x + width, y, z, 
      x + width, y, z + depth , x + width, y - height, z + depth , x + width, y - height, z , x, y, z , x + width, y, z , x + width, y, z + depth , x, y, z + depth, 
      x, y - height, z , x + width, y - height, z , x + width, y - height, z + depth , x, y - height, z + depth}; 

    float[] texcoords = new float[48] { 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1 }; 
    int vSize; 
    int tSize; 
    uint[] vboName = new uint[1] { 0 }; 
    uint[] texName = new uint[1] { 0 }; 

내 방법은 버퍼를로드 :

  Gl.glEnableClientState(Gl.GL_VERTEX_ARRAY); 
     Gl.glEnableClientState(Gl.GL_TEXTURE_COORD_ARRAY); 

     Gl.glBindBufferARB(Gl.GL_ARRAY_BUFFER_ARB, texName[0]); 
     Gl.glBindBufferARB(Gl.GL_ARRAY_BUFFER_ARB, vboName[0]); 

     Gl.glVertexPointer(3, Gl.GL_FLOAT, 0, null); 
     Gl.glTexCoordPointer(2, Gl.GL_FLOAT, 0, null); 

     Gl.glDrawArrays(Gl.GL_QUADS, 0, 24); 

     Gl.glDisableClientState(Gl.GL_TEXTURE_COORD_ARRAY); 
     Gl.glDisableClientState(Gl.GL_VERTEX_ARRAY); 

그리고 마지막으로, 결과 :

  Gl.glEnable(Gl.GL_ARRAY_BUFFER_ARB); 

     vSize = points.Length/3; 
     int s = points.Length * sizeof(float); 
     object ss = s; 
     IntPtr size = new IntPtr(ss.GetHashCode()); 

     tSize = texcoords.Length/2; 
     int t = texcoords.Length * sizeof(float); 
     object tt = t; 
     IntPtr tsize = new IntPtr(tt.GetHashCode()); 

     Gl.glGenBuffersARB(1, vboName); 
     Gl.glBindBufferARB(Gl.GL_ARRAY_BUFFER_ARB, vboName[0]); 
     Gl.glBufferDataARB(Gl.GL_ARRAY_BUFFER_ARB, size, points, Gl.GL_STATIC_DRAW); 

     Gl.glGenBuffersARB(1, texName); 
     Gl.glBindBufferARB(Gl.GL_ARRAY_BUFFER_ARB, texName[0]); 
     Gl.glBufferDataARB(Gl.GL_ARRAY_BUFFER_ARB, tsize, texcoords, Gl.GL_STATIC_DRAW); 

     Gl.glDisable(Gl.GL_ARRAY_BUFFER_ARB); 

내 방법은 모델을 그릴

답변

0

벙어리 실수 ... 텍스처를 적용하기 전에 버퍼를 바인드하는 것을 잊어 버렸습니다.

 Gl.glEnableClientState(Gl.GL_VERTEX_ARRAY); 
     Gl.glEnableClientState(Gl.GL_TEXTURE_COORD_ARRAY); 


     Gl.glBindBufferARB(Gl.GL_ARRAY_BUFFER_ARB, vboName[0]); 

     Gl.glVertexPointer(3, Gl.GL_FLOAT, 0, null); 
     Gl.glBindBufferARB(Gl.GL_ARRAY_BUFFER_ARB, texName[0]); 
     Gl.glTexCoordPointer(2, Gl.GL_FLOAT, 0, null); 

     Gl.glDrawArrays(Gl.GL_QUADS, 0, 24); 

     Gl.glDisableClientState(Gl.GL_TEXTURE_COORD_ARRAY); 
     Gl.glDisableClientState(Gl.GL_VERTEX_ARRAY);