2013-08-01 3 views
0

Я совершенно не знаком с OpenGL, и мне трудно разобраться, как работают текстуры и шейдеры привязки к VBOs.openGL texture/shader binding

Я использую текстуры и шейдерные структуры Cinder. Вот часть моего метода рисования:

mShader.bind(); 

myImage.bind(); 
glPushMatrix(); 
glTranslated(scaledX, scaledY, scaledZ); 
gl::draw(sphere.getVBO()); 
glPopMatrix(); 

glPushMatrix(); 
glTranslated(0, 0, zshift - 200); 
mDisc.draw(); 
glPopMatrix(); 

В приведенном выше коде, если я закомментировать вызов mShader.bind(), моя сфера VBO будет отображать текстуру (myImage). Мой шейдер работает отлично для простых (нетекстурированных) фигур, но когда я привязываю шейдер перед рисованием любых фигур с обернутыми текстурами, он блокирует отображение текстур.

Это проблема с шейдером, который я использую, или это что-то еще, что я не понимаю? (... есть еще много, я не понимая)

Благодаря

редактировать:

вот шейдеры я использую:

(осколочная):

uniform sampler2DShadow  depthTexture; 

varying vec3    N, V, L; 
varying vec4    q; 

void main(void) 
{ 
    vec3 normal = normalize(N); 
    vec3 R = -normalize(reflect(L, normal)); 

vec4 ambient = gl_FrontLightProduct[0].ambient; 
vec4 diffuse = gl_FrontLightProduct[0].diffuse * max(dot(normal, L), 0.0); 
vec4 specular = gl_FrontLightProduct[0].specular * pow(max(dot(R, V), 0.0), gl_FrontMaterial.shininess); 

vec3 coord = 0.5 * (q.xyz/q.w + 1.0); 
float shadow = shadow2D(depthTexture, coord).r; 
gl_FragColor = ((ambient + (0.2 + 0.8 * shadow) * diffuse) + specular * shadow); 

}

(верт):

varying vec3  N, V, L; 
varying vec4  q; 
uniform mat4  shadowTransMatrix; 

void main(void) 
{ 
    vec4 eyeCoord = gl_ModelViewMatrix * gl_Vertex; 

V = normalize(-eyeCoord.xyz); 
L = normalize(gl_LightSource[0].position.xyz - eyeCoord.xyz); 
N = gl_NormalMatrix * gl_Normal; 

q = shadowTransMatrix * eyeCoord; 

gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; 

}

+3

Показать свой шейдерный код. Большую часть времени вам понадобится другой шейдер для текстурирования. Также этот код смешивает VBOs и шейдеры с устаревшими функциями. –

+0

"* Я использую текстуры и шейдерные структуры Cinder. *« Если вы хотите понять, как работает OpenGL, вам нужно подвергать себя * OpenGL *, а не классам, которые * скрывают * OpenGL. –

+0

Я добавил шейдеры. Я ворую в проекте для класса psyc и очень ограниченное время.Я скоро изучу OpenGL, но на данный момент я просто пытаюсь понять достаточно, чтобы сжечь что-то приличное вместе. – jag

ответ

2

Вы должны осуществлять выборки текстур себя в вашем шейдере. Я вижу, что шейдер уже использует теневой сэмплер текстур, является ли текстура, которую вы хотите использовать? Если да, то вы должны сделать это:

  1. Установите активный блок текстуры: glActiveTexture(GL_TEXTURE0);
  2. Activate текстуры: вероятно myImage.bind();
  3. Получить расположение единой переменной 'depthTexture': GLint loc = glGetUniformLocation(program, "depthTexture");
  4. Bind текстура вам текстурный пробоотборник в шейдере: glUniform1i(loc, 0);

Примечания: На шаге 3 вы должны передать идентификатор программы шейдера в качестве первого параметр - glGetUniformLocation. Я не знаю Текстура и шейдерные структуры Cinder, но я полагаю, что есть возможность запросить их непосредственно для однородных местоположений переменных (или даже установить значения переменных напрямую), или, по крайней мере, они должны позволить вам получить идентификатор программы. На шаге 4 вы сообщаете OpenGL, чтобы установить пробоотборник depthTexture на текстуру первой единицы текстуры (которая имеет индекс 0); вам нужно сделать это, потому что вы ранее выбрали этот блок текстур с glActiveTexture(GL_TEXTURE0);.

См. Также this для более подробного примера использования текстур в шейдерах.

+0

С шейдерами вам больше не нужно 'glEnable (GL_TEXTURE_ ...);' Большая часть того, что раньше контролировалось glEnable, теперь определяется в терминах выполнения шейдера. – datenwolf

+0

@ datenwolf, спасибо, я отредактировал ответ соответственно. –

+0

ok hmm, да, я, очевидно, пропущу некоторую основную информацию. Теневая текстура в шейдере работает так, как я хочу, когда рисую геометрические фигуры с помощью displaylists с материалами (класс cinder), установленными для каждого списка. Проблема возникает, когда я хочу использовать теневой шейдер на VBO, который я сделал (импортируя файл .obj, который я сделал в Photoshop); в частности, я не могу заставить текущий шейдер работать с VBO, когда я обертываю вокруг него текстуру (которая является всего лишь .png цветка). – jag