Слот текстуры не правильно выбирается в шейдере - PullRequest
0 голосов
/ 28 марта 2020

Для объекта куба здесь id текстуры равен 1.0f для всех вершин.
И текстура привязана к GL_TEXTURE1.
Поле отображается следующим образом:
Texture slot loading

Чтобы проверить, передал ли я правильный идентификатор текстуры, включите этот код в шейдер ниже, который дал следующий результат

    //Checking texture id with index
    //texColor = vec4(float(index),float(index),float(index),float(index));

Texture slot int value

Чтобы проверить значение с плавающей запятой для идентификатора текстуры, который я передавал, включил код ниже и увидел следующее

    //Checking texture id with float index
    //texColor = vec4(v_TexIndex,v_TexIndex,v_TexIndex,v_TexIndex);

Texture slot float value

Кажется, что преобразование с плавающей точкой в ​​int здесь не работает.

highp int index = int(v_TexIndex);

Так что, чтобы исправить это, я сделал ниже и получил правильный результат.

highp int index = int(v_TexIndex+0.1);

enter image description here

Похоже, что для некоторых вершин v_TexIndex равен 0,99, и добавление 0,1 помогает округлить его до 1, когда происходит преобразование int.

Итак, мне было интересно, почему значение v_TexIndex не подходит, когда речь идет о фрагментном шейдере?

#shader vertex
#version 440 core

layout(location = 0) in vec4 position;
layout(location = 1) in vec4 color;
layout(location = 2) in vec2 texCoords;
layout(location = 3) in float texIndex;

out vec2 v_TexCoord;
out vec4 v_Color;
out float v_TexIndex;

uniform mat4 u_MVP;

void main()
{
    gl_Position = u_MVP*position;
    v_TexCoord = texCoords;
    v_Color = color;
    v_TexIndex = texIndex;
}

#shader fragment
#version 440 core

layout(location = 0) out vec4 color;

in vec2 v_TexCoord;
in vec4 v_Color;
in float v_TexIndex;

uniform sampler2D u_Textures[32];
uniform float u_SelectColorf;

void main()
{

    highp int index = int(v_TexIndex);

    vec4 SelectColorVec = vec4(u_SelectColorf,u_SelectColorf,u_SelectColorf,u_SelectColorf);
    vec4 OneMinusSelectColorVec = vec4(1.0f-u_SelectColorf,1.0f-u_SelectColorf,1.0f-u_SelectColorf,1.0f-u_SelectColorf);

    vec4 texColor = OneMinusSelectColorVec * texture(u_Textures[index],v_TexCoord);
    texColor += SelectColorVec * v_Color;

    //Checking texture id with index
    //texColor = vec4(float(index),float(index),float(index),float(index));

    //Checking texture id with float index
    //texColor = vec4(v_TexIndex,v_TexIndex,v_TexIndex,v_TexIndex);

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