Проблемы с прозрачностью LWJGL "отбрасывать", все невидимо? - PullRequest
0 голосов
/ 13 ноября 2018

Когда я пытаюсь реализовать прозрачность для своих текстур в LWJGL 3, модели кажутся полностью прозрачными и, таким образом, вообще не видны.Когда я снимаю чек, он работает нормально.Любая подсказка о том, почему?

Вот код шейдера, где проверяется альфа-компонент:

#version 430

in vec2 pass_textureCoords;
in vec3 surfaceNormal;
in vec3 toLightVector[5];
in vec3 toCameraVector;
in float visibility;

out vec4 out_Color;

uniform sampler2D textureSampler;
uniform vec3 lightColour[5];
uniform vec3 attenuation[5];
uniform float shineDamper;
uniform float reflectivity;
uniform vec3 skyColour;

void main(void) {

    vec3 unitNormal = normalize(surfaceNormal);
    vec3 unitVectorToCamera = normalize(toCameraVector);

    vec3 totalDiffuse = vec3(0.0);
    vec3 totalSpecular = vec3(0.0);

    for (int i = 0; i < 5; i++) {
        float distance = length(toLightVector[i]);
        float attFactor = attenuation[i].x + (attenuation[i].y * distance) + (attenuation[i].z * distance * distance);
        vec3 unitLightVector = normalize(toLightVector[i]);
        float nDot1 = dot(unitNormal, unitLightVector);
        float brightness = max(nDot1, 0.0);
        vec3 lightDirection = -unitLightVector;
        vec3 reflectedLightDirection = reflect(lightDirection, unitNormal);
        float specularFactor = dot(reflectedLightDirection, unitVectorToCamera);
        specularFactor = max(specularFactor, 0.0);
        float dampedFactor = pow(specularFactor, shineDamper);
        totalDiffuse = totalDiffuse + (brightness * lightColour[i])/attFactor;
        totalSpecular = totalSpecular + (dampedFactor * reflectivity * lightColour[i])/attFactor;
    }
    totalDiffuse = max(totalDiffuse, 0.2);


////////////////////////////////////////////////////////////////////////////
    vec4 textureColour = texture(textureSampler, pass_textureCoords);
    if (textureColour.a < 0.5) {
        discard;
    }
////////////////////////////////////////////////////////////////////////////

    out_Color = vec4(totalDiffuse, 1.0) * textureColour + vec4(totalSpecular, 1.0);
    out_Color = mix(vec4(skyColour,1.0),out_Color, visibility);

}

Я трижды проверил, все ли загружено в шейдер в правильном порядке и т. Д.,но единственный способ заставить текстуры появляться - это убрать эту проверку.

Пожалуйста, спросите что-нибудь еще полезное.Спасибо!

РЕДАКТИРОВАТЬ 1:

Загрузка текстуры из изображения:

protected Texture loadTexture(BufferedImage image, String info) {
    Texture texture;

    int width = image.getWidth();
    int height = image.getHeight();
    int[] pixels = image.getRGB(0, 0, width, height, null, 0, width);

    ByteBuffer buffer = BufferUtils.createByteBuffer((width * height) * 4);
    int id = glGenTextures();

    for (int i = 0; i < pixels.length; i++) {
        byte r = (byte)((pixels[i] >> 16) & 0xFF);
        byte g = (byte)((pixels[i] >> 8) & 0xFF);
        byte b = (byte)(pixels[i] & 0xFF);
        byte a = (byte)((pixels[i] >> 24) * 0xFF);
        buffer.put(r);
        buffer.put(g);
        buffer.put(b);
        buffer.put(a);
    }
    buffer.flip();
    glBindTexture(GL_TEXTURE_2D, id);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);
    glBindTexture(GL_TEXTURE_2D, 0);

    texture = new Texture(id, buffer, width, height);
    if (info != "") processData(info, texture);
    return texture;
}

РЕДАКТИРОВАТЬ 2:

После попытки Out_Color = vec4(textureColour.aaa, 1.0);

enter image description here

1 Ответ

0 голосов
/ 13 ноября 2018

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

    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
            int pixel = image.getRGB(x, y);
            byte alpha = (byte)((pixel >> 24) & 0xff);
            byte red = (byte)((pixel >> 16) & 0xff);
            byte green = (byte)((pixel >> 8) & 0xff);
            byte blue = (byte)((pixel >> 0) & 0xff);
            buffer.put(red);
            buffer.put(green);
            buffer.put(blue);
            buffer.put(alpha);
        }
    }

, который отлично работает!

...