26.6.10

Ворчания пост

Везёт мне в последние дни на мистические баги, связанные с шейдерными компиляторами. Ну просто невероятно везёт. Руки вроде как из правильного места всегда были, однако ж..

Недавно вот начал OpenGL изучать, дошло дело до шейдеров. Поглядел примеры, потыкал, погуглил, снова потыкал, и уже что-то получилось. Конкретнее - blur-шейдер. Казалось бы, работает как часы, чего ещё можно желать? Надо двигаться дальше. Но грёбаный перфекционизм в который раз подложил свинью: захотелось мне код компиляции, линковки и других операций с шейдерами обернуть в классег. Уверенный в победе, я даже не подумал сделать бекап неказистого, но работающего кода. Ох, как я потом пожалел..
Алгоритм остался прежним, только теперь он был напичкан защитным кодом и размазан по нескольким методам; самих шейдеров я не касалася вообще.
И что вы думаете? Сначала glGetObjectParameterivARB( program, GL_OBJECT_LINK_STATUS_ARB, &status ) стал тихо-мирно возвращать 0. Начал разбираться, сделал вывод лога компиляции и линковки. В логе - дикий трындец. «Как оно вообще, б◦◦◦ь, здесь работало?!» - припомнил я чьи-то слова. Шрёдинбаг подкрался незаметно. Помимо пачки ворнингов про "glsl не умеет сишные массивы" и окололежащее (которые были ликвидированы очередной сессией гугления) в логе красовалось:
(22): error С1013: function "main" already defined at (2)
И красуется там поныне. Ощущение, что мейны в vs и ps конфликтуют. И точно: переименовал вершинный main в whateva - ошибки как не бывало, только естественно нихрена этой программой не рендерится. Гугл про эту ошибку либо молчит как партизан либо выдаёт ахинею. Версия о вине драйверов отвалилась, т.к. примеры огл-программ как работали, так и работают. Несколько дней дальнейших non-stop плясок с бубном на ушах ничем не увенчались..
Нет, я могу понять почему я вообще на эту ошибку напоролся: тупо из-за нехватки знаний и опыта. Но вот вы мне можете рассказать, почему как оно, б◦◦◦ь, вообще работало?!

А сегодня RenderMonkey, почувствовав, видать, недостаток внимания, откалывает такой номер:
(6): error X4818: internal error: invalid swizzle found
на таком коде:
sampler2D Texture0;
sampler2D Texture1;

float4 main( float2 tc : TEXCOORD ) : COLOR
{
float off_x = tex2D( Texture1, tc*0.25 ).r; // 6-я строка
float off_y = tex2D( Texture1, tc.yx*0.25 ).r;
return tex2D( Texture0, tc+float2(off_x,off_y)*0.05-0.025 );
}

На 2.0 и 2.0b - ошибка компилятора на ровном месте, на 2.0a и 3.0 - никаких проблем, а стоит хотя бы в одной из строк убрать *0.25, ошибка и вовсе ретируется. "У вас бубны есть? Мне пожалусто двуствольный!" -_-

УПД 29.06:
Первая трабля решена..
GLhandleARB vs_blur   = glCreateShaderObjectARB( GL_FRAGMENT_SHADER_ARB );
GLhandleARB ps_blur_x = glCreateShaderObjectARB( GL_FRAGMENT_SHADER_ARB );

Комментариев нет:

Отправить комментарий