2016-10-11 2 views
0

Я пытаюсь текстурировать треугольник с созданной текстурой времени, используя оболочку SharpGL.SharpGL 2D Texture issue

Я не могу понять, почему треугольник остается не текстурированным.

gl.Error() put in draw loop возвращает 0, что означает GL_NO_ERROR.

private void openGLControl_OpenGLDraw(object sender, OpenGLEventArgs args) 
    { 

     OpenGL gl = openGLControl.OpenGL; 
     gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT); 
     gl.LoadIdentity(); 
     gl.Color(1.0f,1.0f,1.0f,1.0f); 
     gl.Begin(OpenGL.GL_TRIANGLES); 
     gl.TexCoord(0, 1.0f); 
     gl.Vertex(0.0f, 0.0f); 
     gl.TexCoord(1.0f, 0f); 
     gl.Vertex(1.0f, 0f); 
     gl.TexCoord(1.0f, 1.0f); 
     gl.Vertex(1.0f, 1.0f); 
     gl.End(); 

    } 

    private void openGLControl_OpenGLInitialized(object sender, OpenGLEventArgs args) 
    { 

     Random rnd = new Random(); 
     OpenGL gl = openGLControl.OpenGL; 
     gl.ClearColor(0, 0, 0, 0); 

     gl.Enable(OpenGL.GL_TEXTURE_2D); 

     byte[] colors = new byte[256 * 256 * 4]; 

     for (int i = 0; i < 256 * 256 * 4; i++) 
     { 
      colors[i] = (byte)rnd.Next(256); 
     } 

     uint[] textureID = new uint[1]; 
     gl.GenTextures(1, textureID); 
     gl.TexImage2D(OpenGL.GL_TEXTURE_2D, 0, (int)OpenGL.GL_RGBA, 256, 256, 0, OpenGL.GL_RGBA, OpenGL.GL_BYTE, colors); 
     gl.BindTexture(OpenGL.GL_TEXTURE_2D, textureID[0]); 

    } 

ответ

0

Вы должны вызвать gl.BindTexture перед вызовом gl.TexImage2D.

Причина этого в первом аргументе обеих функций. OpenGL имеет конечный автомат, который отслеживает, что связано. Когда вы вызываете gl.TexImage2D, вы говорите GL, чтобы загрузить пиксели в текстуру, привязанную в настоящее время к OpenGL.GL_TEXTURE_2D. gl.BindTexture связывает полученную текстуру с OpenGL.GL_TEXTURE_2D.

+0

Спасибо за участие, я пытался называть текстуру Bind перед TexImage, без результата должно быть что-то еще. –

+0

Код, который вы опубликовали, является действительным OpenGL, предполагая, что SharpGL автоматически выполняет автоматическую замену буфера в элементе управления. Вы пробовали сделать целую текстуру сплошным цветом для тестирования? –

+0

Да, я пробовал, без результата :( –

0

Причина, почему текстура не была видна недоставало установка:

uint[] array = new uint[] { OpenGL.GL_NEAREST }; 
     gl.TexParameterI(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MIN_FILTER, array); 
     gl.TexParameterI(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MAG_FILTER, array); 

По умолчанию SharpGL использует MIPMAP, которые не были получены.