Текстура OpenTK работает, только если она не привязана

Обычно я не работаю с низкоуровневыми привязками, так что это может быть что-то глупое, что я упускаю из виду, но я не знаю.

Когда я создаю текстуру из такого файла

public Texture ( List<byte> pixels, int width, int height ) {
    handle = GL.GenTexture();
    GL.TexParameter( TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat );
    GL.TexParameter( TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat );
    GL.TexParameter( TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest );
    GL.TexParameter( TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear );
    GL.TexImage2D( TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, width, height, 0, PixelFormat.Rgba, PixelType.UnsignedByte, pixels.ToArray() );
}

public void Use () {
    GL.Enable( EnableCap.Texture2D );
    GL.ActiveTexture( TextureUnit.Texture0 );
    GL.BindTexture( TextureTarget.Texture2D, handle );
}

И затем визуализируйте это так:

public void Draw () {
    GL.BindVertexArray( VAO );

    //texture.Use();
    shader.Use();

    GL.DrawElements( PrimitiveType.Triangles, indices.Length, DrawElementsType.UnsignedInt, 0 );
}

Почти все работает нормально, пока я не загружу другую текстуру. (это делает все второй текстурой) Вернуться только к одной текстуре, когда я раскомментирую texture.Use(); Все мои треугольники становятся черными. Что здесь происходит?

Я проверил, какие значения дает GL.GenTexture();, и это 1 и 2, в то время как единственный раз, когда текстура рендерится, дескриптор GL.BindTexture равен 0. Установка его на 1 или 2 делает треугольники черными.


person Flutterish    schedule 01.04.2020    source источник
comment
GL.Enable( EnableCap.Texture2D ); устарел, только для контекста профиля совместимости. Это бесполезно и излишне при использовании шейдерной программы, но это не вызывает проблемы.   -  person Rabbid76    schedule 01.04.2020


Ответы (1)


GL.GenTexture() генерирует не текстуру, а ( резервы) идентификатор текстуры (имя), который можно использовать для создания объекта текстуры. Объект текстуры создается, когда идентификатор текстуры привязывается к цели в первый раз с помощью GL.BindTexture. GL.TexImage2D указать двухмерное изображение текстуры (это резервирует память для изображения и инициализирует изображение) существующего объекта текстуры. GL.TexParameter устанавливает параметры для существующего объекта текстуры. Это означает, что вы должны создать объект текстуры с помощью GL.BindTexture, прежде чем вы сможете установить любой параметр текстуры или указать любое изображение текстуры:

public Texture ( List<byte> pixels, int width, int height ) {
    handle = GL.GenTexture();

    GL.BindTexture( TextureTarget.Texture2D, handle ); # <--- THAT IS MISSING

    GL.TexParameter( TextureTarget.Texture2D, TextureParameterName.TextureWrapS, (int)TextureWrapMode.Repeat );
    GL.TexParameter( TextureTarget.Texture2D, TextureParameterName.TextureWrapT, (int)TextureWrapMode.Repeat );
    GL.TexParameter( TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Nearest );
    GL.TexParameter( TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear );
    GL.TexImage2D( TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, width, height, 0, PixelFormat.Rgba, PixelType.UnsignedByte, pixels.ToArray() );
}

Обратите внимание, что текущая привязанная текстура является глобальным состоянием, и это состояние сохраняется до тех пор, пока оно не будет изменено снова. GL.TexImage2D указывает изображение текстуры текущей привязанной текстуры.
Поскольку исходная функция Texture не связывает какой-либо объект текстуры, GL.TexImage2D указывает изображение текстуры этой текстуры, которое случайным образом привязано к цели Texture2D текущей текстуры. единица, в то время.

person Rabbid76    schedule 01.04.2020