2015-09-23 2 views
0

Я реализую простую трассировку лучей для сфер в шейдере фрагментов, и сейчас я работаю над функцией, которая вычисляет цвет для рассеянно заштрихованной сферы. Вот код функции:Opengl ES diffuse shader не работает

vec3 shadeSphere(vec3 point, vec4 sphere, vec3 material) { 
     vec3 color = vec3(1.,2.,3.); 
     vec3 N = (point - sphere.xyz)/sphere.w; 
     vec3 diffuse = max(dot(Ldir, N), 0.0); 
     vec3 ambient = material/5; 
     color = ambient + Lrgb * diffuse * max(0.0, N * Ldir); 
     return color; 
    } 

Я получаю ошибки на двух строках, где я использую функцию max. Я получил код для строки, в которой я присваивающую max(dot(Ldir,N),0.0) из шпаргалки WebGL, которая использует функцию max(dot(ec_light_dir, ec_normal), 0.0); По какой-то причине, моя реализация не работает, как я получаю сообщение об ошибке:

ERROR: 0:38: 'max' : no matching overloaded function found 

Что может проблема с любой из этих максимальных функций, которые я использую?

ответ

2

В вашем шейдере есть 2 max сообщений. Это вторая проблема.

max(0.0, N * LDir) не имеет смысла. N - это vec3. Нет версии max, которая принимает max(float, vec3). Там это версия max это max(vec3, float) так поменяться, что быть

`max(N * LDir, 0.0)` 

и она могла бы работать. В основном ваш шейдер NOT ES-шейдер. Возможно, он используется на драйвере, который не соответствует спецификации (т. Е. У водителя есть ошибка). WebGL пытается следовать спецификации 100%

2

dot продукт представляет собой скалярное значение не vec3, вам необходимо либо хранить его в поплавка

float diffuse = max(dot(Ldir, N),0.0);

или инициализировать Vec3 с ним

vec3 diffuse = vec3(max(dot(Ldir, N),0.0));

То же самое для термина ambient. Обычно как диффузные, так и окружающие термины являются просто скалярами.

Смежные вопросы