Войти
ПрограммированиеФорумГрафика

Передача структуры в шейдер.

Страницы: 1 2 Следующая »
#0
23:08, 3 июня 2010

Здравствуйте, прогеры! Надеюсь среди вас найдутся OpenGL-щики.
Мне надо отправить через uniform объект данной структуры.
Я попробовал так, но не получается.

struct mylight {
vec3 pos,col;
float rad, sila;
};
...
milight li;
...
GLuint loc_light;
loc_light = glGetUniformLocationARB(progO,"light");
...
glUniform4fv(loc_light,2,(GLfloat *)&li);
//4 и 2 т.к. структура, в принципе является восемью флоатами
Проверял, линкую шейдер до получения адреса uniform-a.
Подскажите что делать, пожалуйста.


#1
23:10, 3 июня 2010

Фломастер
> glGetUniformLocationARB(progO,"light");

пробуй так

glGetUniformLocationARB(progO,"light.pos");
glGetUniformLocationARB(progO,"light.col");

понятно ?

#2
23:47, 3 июня 2010

Попробую.
А если есть массив объектов..
Как поступать в этом случае?

#3
23:51, 3 июня 2010

Фломастер
> Попробую.
> А если есть массив объектов..
> Как поступать в этом случае?
я так делал

glGetUniformLocationARB(progO,"light[0].col");
glGetUniformLocationARB(progO,"light[1].col");

спек почитай

#4
11:28, 4 июня 2010

Извиняюсь, а что такое "спек"?

#5
11:34, 4 июня 2010

Фломастер
> Извиняюсь, а что такое "спек"?
спецификация, документ по GL

#6
11:47, 4 июня 2010

А чем тебе gl_LightSource не нравится?

К прочтению: "OpenGL. Orange book."
http://glscene.ru/download.php?view.374

#7
12:23, 4 июня 2010

Мне нравится, я хочу именно научиться.
Всё сделал, заработало как надо, но потом внезапно что-то не то написал и перестало работать - сейчас ищу ошибку, но найти не могу :(

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

struct mylight {
vec3 pos,col;
float rad, sila;
};


uniform mylight light;
varying vec3 coords;

void main(void)
{

gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
gl_FrontColor = gl_Color;
gl_TexCoord[0] = gl_MultiTexCoord0;
coords=(gl_Vertex).xyz+light.pos;
}

Фрагментарный шейдер: (или фрагментный?)

struct mylight {
vec3 pos,col;
float rad, sila;
};

uniform sampler2D dgTexture;
uniform mylight light;
varying vec3 coords;

void main(void)
{
vec4 tColor = texture2D( dgTexture, gl_TexCoord[0].st );
vec3 colA;
colA=vec3(1,1,1);

n=sqrt(coords.x*coords.x+coords.y*coords.y+coords.z*coords.z);
if(n<light.rad) n=light.rad; 
tColor.r=tColor.r*(colA.r+light.sila*light.col.r/n); 
tColor.g=tColor.g*(colA.g+light.sila*light.col.g/n); 
tColor.b=tColor.b*(colA.b+light.sila*light.col.b/n); 
gl_FragColor = tColor * gl_Color; 
}
Код программы(где рендерю объекты):
mylight li;
li.pos=vector3(1,1,1);
li.col=vector3(.3,.6,.9);
li.rad=.1;
li.sila=.3;

glUseProgramObjectARB(progO);
    GLuint loc_lightpos,loc_lightcol,loc_lightrad,loc_lightsila;
loc_lightpos = glGetUniformLocationARB(progO,"light.pos");
loc_lightcol = glGetUniformLocationARB(progO,"light.col");
loc_lightrad = glGetUniformLocationARB(progO,"light.rad");
loc_lightsila = glGetUniformLocationARB(progO,"light.sila");

glUniform3fv(loc_lightpos,1,(GLfloat *)&li.pos);
glUniform3fv(loc_lightcol,1,(GLfloat *)&li.col);
glUniform1fv(loc_lightrad,1,(GLfloat *)&li.rad);
glUniform1fv(loc_lightsila,1,(GLfloat *)&li.sila);
box km(0,0,0,1,5,1,63,0);
km.draw();
glUseProgramObjectARB(0);

Выполняется, но шейдеры не работают. Помогите, пожалуйста!

#8
12:24, 4 июня 2010

Фломастер
> Фрагментарный шейдер: (или фрагментный?)
фрагментаторный, так точнее :)

> loc_lightpos = glGetUniformLocationARB(progO,"light.pos");
> loc_lightcol = glGetUniformLocationARB(progO,"light.col");
> loc_lightrad = glGetUniformLocationARB(progO,"light.rad");
> loc_lightsila = glGetUniformLocationARB(progO,"light.sila");

location положительные ?

#9
12:26, 4 июня 2010

ЫЫЫЫыыы автор это ты на дваче писал?) ))))

#10
12:30, 4 июня 2010

А что такое два-ч?

Я дурак, не объявил переменную n...
Как избегать подобных ошибок - ведь в блокноте случайно не то напишешь - просто шейдер работать не будет...
Есть какие-нибудь средства?

#11
13:30, 4 июня 2010

Рендер манки, нотепад++, может надстройки на студию есть хз я от этого отстал :) форумчане, надеюсь после дембеля поможете  нагнать ;)

#12
19:34, 4 июня 2010

http://2-ch.ru/pr/res/23202.html

Вот такой)))

#13
8:17, 6 июня 2010

Фломастер
> Как избегать подобных ошибок

Смотреть лог ошибок?

#14
9:47, 6 июня 2010

А как на счёт такого?


uniform  vec4 u_matrix[8];
#define projection mat4 (u_matrix[0], u_matrix[1], u_matrix[2], u_matrix[3])
#define modelView mat3x4 (u_matrix[4], u_matrix[5], u_matrix[6])
#define normalView mat3 (u_matrix[4].xyz, u_matrix[5].xyz, u_matrix[6].xyz)

Страницы: 1 2 Следующая »
ПрограммированиеФорумГрафика

Тема в архиве.