Я реализовал шейдер для поверхности солнца, который использует шум simplex
от ashima/webgl-noise. Но это стоит слишком много времени GPU, особенно если я собираюсь использовать его на мобильных устройствах. Мне нужно сделать тот же эффект, но с использованием текстуры шума. Мой пиксельный шейдер ниже:GLSL - Использование 2D-текстуры для 3D-шума Perlin вместо процедурного 3D-шума
#ifdef GL_ES
precision highp float;
#endif
precision mediump float;
varying vec2 v_texCoord;
varying vec3 v_normal;
uniform sampler2D u_planetDay;
uniform sampler2D u_noise; //noise texture (not used yet)
uniform float u_time;
#include simplex_noise_source from Ashima
float noise(vec3 position, int octaves, float frequency, float persistence) {
float total = 0.0; // Total value so far
float maxAmplitude = 0.0; // Accumulates highest theoretical amplitude
float amplitude = 1.0;
for (int i = 0; i < octaves; i++) {
// Get the noise sample
total += ((1.0 - abs(snoise(position * frequency))) * 2.0 - 1.0) * amplitude;
//I USE LINE BELOW FOR 2D NOISE
total += ((1.0 - abs(snoise(position.xy * frequency))) * 2.0 - 1.0) * amplitude;
// Make the wavelength twice as small
frequency *= 2.0;
// Add to our maximum possible amplitude
maxAmplitude += amplitude;
// Reduce amplitude according to persistence for the next octave
amplitude *= persistence;
}
// Scale the result by the maximum amplitude
return total/maxAmplitude;
}
void main()
{
vec3 position = v_normal *2.5+ vec3(u_time, u_time, u_time);
float n1 = noise(position.xyz, 2, 7.7, 0.75) * 0.001;
vec3 ground = texture2D(u_planetDay, v_texCoord+n1).rgb;
gl_FragColor = vec4 (color, 1.0);
}
Как я могу исправить это шейдер работать с текстурой шума и что должно текстура выглядеть?
Насколько я знаю, OpenGL ES 2.0
не поддерживает 3D-текстуры. Более того, я не знаю, как создать 3D-текстуру.
Как выглядит ваша шумовая текстура? – Nolesh
@Nolesh просто случайные значения (т. Е. 'Rand()% 255'), но требуется фильтрация GL_LINEAR. – jozxyqk
Возможно, я использую его неправильно. vec3 position = v_normal + vec3 (время, 0, 0); float n1 = noise3D (позиция); gl_FragColor = vec4 (vec3 (n1, n1, n1), 1.0); Я получаю аналогичный результат, как если бы я использовал texture2D (u_noise, position.xy) .x; – Nolesh