Этот рассеивающий шейдер opengl делает мою текстуру прозрачной

82
15

Я импортирую файлы.obj в opengl, и сетка отображается в порядке, но теперь я хочу рассеять оттенок. Я использовал шейдер ниже, но он просто делает мою сетчатую текстуру полупрозрачной. Кроме того, я не делал ничего особенного с нормалями, которые я только что подключил к opengl.

Vertex Shader

uniform mat4 u_MVPMatrix;       // A constant representing the combined model/view/projection matrix.                  
uniform mat4 u_MVMatrix; // A constant representing the combined model/view matrix.

attribute vec4 a_Position; // Per-vertex position information we will pass in.
attribute vec3 a_Normal; // Per-vertex normal information we will pass in.
attribute vec2 a_TexCoordinate; // Per-vertex texture coordinate information we will pass in.

varying vec3 v_Position; // This will be passed into the fragment shader.
varying vec3 v_Normal; // This will be passed into the fragment shader.
varying vec2 v_TexCoordinate; // This will be passed into the fragment shader.

// The entry point for our vertex shader.
void main()
{
// Transform the vertex into eye space.
v_Position = vec3(u_MVMatrix * a_Position);

// Pass through the texture coordinate.
v_TexCoordinate = a_TexCoordinate;

// Transform the normal orientation into eye space.
v_Normal = vec3(u_MVMatrix * vec4(a_Normal, 0.0));

// gl_Position is a special variable used to store the final position.
// Multiply the vertex by the matrix to get the final point in normalized screen coordinates.
gl_Position = u_MVPMatrix * a_Position;
}

Фрагментный шейдер

precision mediump float;        // Set the default precision to medium. We don't need as high of a 
// precision in the fragment shader.
uniform vec3 u_LightPos; // The position of the light in eye space.
uniform sampler2D u_Texture; // The input texture.

varying vec3 v_Position; // Interpolated position for this fragment.
varying vec3 v_Normal; // Interpolated normal for this fragment.
varying vec2 v_TexCoordinate; // Interpolated texture coordinate per fragment.

// The entry point for our fragment shader.
void main()
{
// Will be used for attenuation.
float distance = length(u_LightPos - v_Position);

// Get a lighting direction vector from the light to the vertex.
vec3 lightVector = normalize(u_LightPos - v_Position);

// Calculate the dot product of the light vector and vertex normal. If the normal and light vector are
// pointing in the same direction then it will get max illumination.
float diffuse = max(dot(v_Normal, lightVector), 0.0);

// Add attenuation.
diffuse = diffuse * (1.0 / (1.0 + (0.25 * distance)));

// Add ambient lighting
diffuse = diffuse + 0.7;

// Multiply the color by the diffuse illumination level and texture value to get final output color.
gl_FragColor = (diffuse * texture2D(u_Texture, v_TexCoordinate));
}

В униформе u_LightPos я посылаю GLES20.glUniform3f(uLightPosition, 0.0f, 0.0f, 1.0f); этой, GLES20.glUniform3f(uLightPosition, 0.0f, 0.0f, 1.0f);

Как я уже сказал, это просто делает полупрозрачную текстуру вместо диффузного затенения. Я что-то упускаю?

спросил(а) 2015-05-30T05:30:00+03:00 5 лет, 3 месяца назад
1
Решение
57

Последняя строка умножает значение w или альфа gl_FragColor на diffuse + 0.7, которое в случае диффузии близко к 0 будет эффективно сделать вашу текстуру прозрачной.

Чтобы решить эту проблему, сначала загрузите значение texture2D в vec3, затем умножьте на diffuse и после создания vec4 для хранения в gl_FragColor с правильным альфа-значением.

ответил(а) 2015-05-30T06:11:00+03:00 5 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема