Проблема с рендерингом текстур с помощью альфы - PullRequest
1 голос
/ 25 июля 2011

Я в настоящее время проектирую игровой движок, и я столкнулся с проблемой в моих изображениях, состоящей в том, что значение альфа в изображениях не отображается.В настоящее время я использую систему OpenGL, где каждый объект текстуры имеет буферы для координат вершин, цветов и текстур, которые связаны и нарисованы вместе в методе drawRect :.Хотя альфа будет смешивать все изображение в целом, я хочу, чтобы цвет, который использовался, смешивался с текстурой, поскольку в настоящее время он выступает в качестве «основы» для текстуры, становясь видимым в тех областях текстуры, которые имеют альфа.Когда цвет не используется при рисовании, любые альфа-области просто кажутся белыми.

Вот изображение с альфой, которое я не хочу отображать (в качестве теста), и вот как оно выглядит:

The image I'm trying to render with the alpha it has

How the image is rendered

Вот мой код:

Часть моего класса текстурных объектов:

if (width2== 2 && height2 == 2) {

        // Allocate the texture.  Apples storage method currently does not work for GL_TEXTURE_2D.  REVISIT CODE TO INTEGRATE IT!
        glEnable(GL_TEXTURE_2D);
        glGenTextures(1, &myTextureName);
        glBindTexture(GL_TEXTURE_2D, myTextureName);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, myData);
        //glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT ,GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_ARB,myTextureName, 0);

        type = Normal_Texture;
        CDMeshVertexesCreateRectangle(1, 1, texture);
    }

    else {
        // The extension GL_TEXTURE_RECTANGLE_ARB can be used for non-power of two textures, but it is slower than GL_TEXTURE_2D and 
        // not supported by all graphics cards.
        glEnable(GL_TEXTURE_RECTANGLE_ARB);
        glGenTextures(1, &myTextureName);
        glBindTexture(GL_TEXTURE_RECTANGLE_ARB, myTextureName);
        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER,GL_NEAREST);
        glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER,GL_NEAREST);
        glTexParameterf(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
        glTexParameterf(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
        glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
        glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8, width, height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, myData);
        //glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT ,GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_RECTANGLE_ARB,myTextureName, 0);

        type = Rectangular_Texture;
        CDMeshVertexesCreateRectangle(width, height, texture);
    }

Код запуска для визуализации внутри объекта:

glEnableClientState(GL_VERTEX_ARRAY); // Activate vertex coordinates array
glEnableClientState(GL_COLOR_ARRAY);

glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glVertexPointer(vertexStride, GL_FLOAT, 0, 0);   

glBindBuffer(GL_ARRAY_BUFFER, colorBuffer);
glColorPointer(colorStride, GL_FLOAT, 0, 0);

// Enable client states for drawing the various arrays
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(texType);

// Bind buffer and use the VBO's to draw
glBindBuffer(GL_ARRAY_BUFFER, texBuffer);
glTexCoordPointer(2, GL_FLOAT, 0, 0);
glBindTexture(texType, texID);

//render
glDrawArrays(renderStyle, 0, vertexCount);

glDisableClientState(GL_VERTEX_ARRAY); // Deactivate vertex coordinates array
glDisableClientState(GL_COLOR_ARRAY);

// Disale client states as were done with them.
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(texType);

Дополнительные параметры, используемые для визуализации:

glDisable(GL_DEPTH_TEST);
glDisable(GL_LIGHTING);
glDisable(GL_CULL_FACE);
glDisable(GL_BLEND);

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glShadeModel(GL_FLAT);

Есть предложения о том, как это можно сделать?

ОБНОВЛЕНИЕ 2 Я отредактировал функцию gltexEnv (), чтобы использовать GL_MODULATE вместо GL_BLEND.Это не влияет на проблему, с которой я сталкиваюсь, хотя я собираюсь продолжить использовать GL_MODULATE для альфа-смешивания.

UPDATE 3 Чтобы объяснить, что именно мне нужно, я хочу в основном иметь возможностьдля отображения изображений с указателем цвета при условии наложения текстуры, а не заливки этого цвета за текстурой, как это происходит в настоящее время.Данные текстуры устанавливаются правильно, и я прошел много шагов, чтобы сузить проблему.Вот пример изображения проблемы:

enter image description here

Ответы [ 2 ]

1 голос
/ 25 июля 2011

Мне нужно будет сделать то же самое для моего приложения, как только я туда доберусь: /.

Я не могу проверить это прямо сейчас, но я знаю, что ваша функция смешивания является ключевой - сейчас вы непосредственно смешиваете текстуру на поверхности с альфа Попробуйте изменить функцию смешивания. Я использовал их в прошлом: glBlendFunc (GL_ONE, GL_ONE); или glBlendFunc (GL_SRC_ALPHA, GL_ONE);

Есть запись вики для объединенных текстур: http://www.opengl.org/wiki/Texture_Combiners

0 голосов
/ 26 июля 2011

Я продолжал просматривать примеры и проблемы других людей на веб-сайте Stack Overflow и наткнулся на этот пример: Ссылка

Используя следующий код из этого примера, перед рисованием смешанной текстурыцветной указатель с текстурой:

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);  
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_MODULATE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_ALPHA, GL_SRC_ALPHA);

Теперь это результат: enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...