{{notification.text}}

MirGames

11.11.08 01:14
0
Сделал попиксельное освещение(ну и нормали слегка искажаются). Приношу на работу - на встроенной интеловской видюхе работает. Нашёл машину с ATI(не помню какая именно). Запускаю - шейдер не компилится. Вопрос, почему такое может быть? Шейдер ниже. Как вообще писать чтоб везде работало? Может есть какие-то правила, которые нужно соблюдать чтоб везде работало?

Вершинный:
Код

uniform vec3 LightPos;
uniform vec3 EyePos;

varying vec3 l; // Vector to the light
varying vec3 n; // Normal
varying vec3 h;
varying vec3 v;  // vector to the eye

void main(void){
LightPos = vec3(gl_ModelViewMatrix*vec4(LightPos,1));
EyePos = vec3(gl_ModelViewMatrix*vec4(EyePos,1));

vec3 p = vec3(gl_ModelViewMatrix * gl_Vertex);

l = normalize(LightPos-p);
n = normalize(gl_NormalMatrix*gl_Normal);
v = normalize(EyePos-p);
h = normalize(l+v);

gl_Position = ftransform();
gl_TexCoord[0] = gl_MultiTexCoord0;
}


Фрагментный:
Код

varying vec3 l; // Vector to the light
varying vec3 n; // Normal
varying vec3 h;
varying vec3 v;

uniform sampler2D texture;
uniform sampler2D noiseTex;

void main(void){
const vec4 diffColor = texture2D(texture,gl_TexCoord[0].xy);
const float ka = 0.2;
const float kd = 1;
const vec4 specColor = vec4(0,1,0,1);
const float specPow = 10;
const float bias = 0.2;
const float rimPow = 6;

vec3 n2 = normalize(n + 2*texture2D(noiseTex,gl_TexCoord[0].xy).rgb-vec3(1));
vec3 l2 = normalize(l);
vec3 h2 = normalize(h);
vec3 v2 = normalize(v);

vec3 tmp = ka+kd*max(dot(n2,l2),vec3(0,0,0));
vec4 diff = diffColor*vec4(tmp,1);
tmp = max(dot(n2,h2),vec3(0,0,0));
vec4 spec = vec4(specColor*pow(tmp,specPow),1);


gl_FragColor = diff + spec;

}


Ну и пример того что получилось в архиве.
Отредактировано: 11.11.08 01:30
#1
11.11.08 01:33
0
division на скоко я помню ати вот такие весчи не любит.

Цитата(division @ Сегодня, 21:14)
[snapback]89337[/snapback]
vec4(LightPos,1)


скачал посмотрел)))издали круть вблизи не очень....
Отредактировано: 11.11.08 01:51
#2
11.11.08 02:18
0
Та смотреть там пока не на что, эт даже не бамп наверно (: Да и текстурка с шумом маленькая. Просто интересно чего не везде работает. Насчет vec4 - спасибо, попробую.
Отредактировано: 11.11.08 02:18
#3
11.11.08 02:41
0
division это связано с ATi.....
#4
Студент
11.11.08 10:51
0
Цитата(lans @ Вчера, 20:41)
[snapback]89345[/snapback]
division это связано с ATi.....

Так ну не с ATi, а со стандартами, которым NV не следует. Следовательно, свзано это с NV :)
#5
аксакал
11.11.08 12:30
0
vec4 в качестве четвёртого параметра может принимать целое число, беда не в нём.

Вершинный
Цитата
ERROR: 0:10: 'assign' : l-value required "LightPos" (can't modify a uniform)
ERROR: 0:11: 'assign' : l-value required "EyePos" (can't modify a uniform)
ERROR: 2 compilation errors. No code generated.

Фрагментный
Цитата
ERROR: 0:10: '=' : assigning non-constant to 'const 4-component vector of float'
ERROR: 0:12: 'const' : non-matching types for const initializer
ERROR: 0:14: 'const' : non-matching types for const initializer
ERROR: 0:16: 'const' : non-matching types for const initializer
ERROR: 0:18: '*' : wrong operand types no operation '*' exists that takes a left-hand operand of type 'const int' and a right operand of type '3-component vector of float' (or there is no acceptable conversion)
ERROR: 0:18: '+' : wrong operand types no operation '+' exists that takes a left-hand operand of type 'varying 3-component vector of float' and a right operand of type 'const int' (or there is no acceptable conversion)
ERROR: 0:23: 'max' : no matching overloaded function found
ERROR: 0:23: '=' : cannot convert from 'float' to '3-component vector of float'
ERROR: 0:25: 'max' : no matching overloaded function found
ERROR: 0:25: 'assign' : cannot convert from 'const float' to '3-component vector of float'
ERROR: 0:26: 'pow' : no matching overloaded function found
ERROR: 0:26: 'constructor' : too many arguments
ERROR: 12 compilation errors. No code generated.
Отредактировано: 11.11.08 12:30
#6
11.11.08 14:13
0
Спасибо. А в чем можно сделать такой отчет об ошибках?
#7
11.11.08 14:47
0
Программа GLSL Validator. Где скачать уже не знаю, на оф. сайте разработчика пишет 404 :wacko:
#8
11.11.08 15:23
0
Хм а RenderMonkey разве не такой-же отчёт выдаст?

Ps: если что исчи её на www.amd.com
Отредактировано: 11.11.08 15:24
#10
11.11.08 17:23
0
Спасибо. А что, в этой программке нельзя просто скопировать код шейдера? Только файл открывать?
#11
11.11.08 18:18
0
Хе, классная вещь, поисправлял ошибки и всё заработало (:
#{{post.Index}}
{{post.Author.Login}}
{{post.CreatedDate | date:'dd.MM.yy HH:mm'}}
{{post.VotesRating}}
Отредактировано: {{post.UpdatedDate | date:'dd.MM.yy HH:mm'}}