2012-01-29 2 views
8

ES 2.0 новинка здесь. В настоящее время я пытаюсь сделать некоторые 3D-чересстрочные изображения из стереоизображений с ES 2.0 и PowerVR SDK. Я могу получить одну текстуру изображения, но когда я пытаюсь вывести второй, я, кажется, переписываю первый. Итак, мой вопрос заключается в том, что, учитывая фрагментарный шейдер ниже, могу ли я использовать его для рисования двух текстур или равномерность формы sampler2d должна быть привязана только к одной текстурной единице? Вот фрагмент шейдер (взят из PowerVR «учебный курс» примеры программ):2 Текстуры, 1 Shader - OpenGL ES 2.0

uniform sampler2D sampler2d;\ 
    varying mediump vec2 myTexCoord;\ 
    void main (void)\ 
    {\ 
     gl_FragColor = texture2D(sampler2d,myTexCoord);\ 
    }"; 

А вот как я загрузка текстур изображения в шейдер:

//LEFT IMAGE 
glActiveTexture(GL_TEXTURE0); 
glGenTextures(1, &m_uiTexture_left);          
glBindTexture(GL_TEXTURE_2D, m_uiTexture_left); 
glUniform1i(glGetUniformLocation(m_uiProgramObject, "sampler2d"), 0); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, pwr2Width, pwr2Height,0, GL_RGB, GL_UNSIGNED_BYTE, xImageL); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
GLfloat afVertices[30] = {0.0}; 
genVertices(afVertices); 
glGenBuffers(1, &m_ui32Vbo_leftimage);         
m_ui32VertexStride = 5 * sizeof(GLfloat); // 3 floats for the pos, 2 for the UVs 
glBindBuffer(GL_ARRAY_BUFFER, m_ui32Vbo_leftimage); 
glBufferData(GL_ARRAY_BUFFER, 6 * m_ui32VertexStride, afVertices, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

//RIGHT IMAGE 
glActiveTexture(GL_TEXTURE1); 
glGenTextures(1, &m_uiTexture_right);         
glBindTexture(GL_TEXTURE_2D, m_uiTexture_right); 
glUniform1i(glGetUniformLocation(m_uiProgramObject, "sampler2d"), 1); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, pwr2Width, pwr2Height,0, GL_RGB, GL_UNSIGNED_BYTE, xImageR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glGenBuffers(1, &m_ui32Vbo_rightimage);      
m_ui32VertexStride = 5 * sizeof(GLfloat); // 3 floats for the pos, 2 for the UVs 
glBindBuffer(GL_ARRAY_BUFFER, m_ui32Vbo_rightimage); 
glBufferData(GL_ARRAY_BUFFER, 6 * m_ui32VertexStride, afVertices, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

Таким образом, этот код просто переписывая формулу sampler2d? Нужна ли мне другая форма или шейдер для второго изображения?

+0

Welp, это неудобно ... Я думаю, что я решил. Прочитав это: http://www.opentk.com/node/2559, я сделал это как плакат «Profet» и переместил вызовы glUniform1i() до моей функции рендеринга, поэтому технически я все еще переписываю значение в sampler2d (afaik), но к тому времени, когда я сделаю второй вызов glUniform1i() и перезапишу его, я уже сделал первое изображение. Может быть, это поможет кому-то, имеющему ту же проблему, что и я сам по себе, и мне трудно найти что-то важное. – Stereoscopic

+0

не могли бы вы ответить, чтобы никто не тратил время на то, чтобы решить какое-то решение :) –

+1

Написать ответ вместо комментария? Конечно, я могу это сделать. (Я новичок на сайте, я не был уверен, что этикет был в отношении ответа на мой собственный вопрос) – Stereoscopic

ответ

7

Хорошо, так как я упомянул в комментарии выше, я в итоге нашел ответ здесь: http://www.opentk.com/node/2559. Как уже упоминалось пользователем «Profet» на этом форуме, одним из способов повторного использования шейдера фрагментов является перемещение вызовов glUniform1i() до функции рендеринга, то есть вызов glUniform1i() для передачи первой текстуры в шейдер, вызов glDraw (нарисуйте текстуру), затем вызовите glUniform1i() и передайте вторую текстуру в шейдер (и нарисуйте). Так что теперь мой Initialise (код) выглядит следующим образом:

//LEFT IMAGE 
glActiveTexture(GL_TEXTURE0); 
glGenTextures(1, &m_uiTexture_left);          
glBindTexture(GL_TEXTURE_2D, m_uiTexture_left); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, pwr2Width, pwr2Height,0, GL_RGB, GL_UNSIGNED_BYTE, xImageL); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
GLfloat afVertices[30] = {0.0}; 
genVertices(afVertices); 
glGenBuffers(1, &m_ui32Vbo_leftimage);         
m_ui32VertexStride = 5 * sizeof(GLfloat); // 3 floats for the pos, 2 for the UVs 
glBindBuffer(GL_ARRAY_BUFFER, m_ui32Vbo_leftimage); 
glBufferData(GL_ARRAY_BUFFER, 6 * m_ui32VertexStride, afVertices, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

//RIGHT IMAGE 
glActiveTexture(GL_TEXTURE1); 
glGenTextures(1, &m_uiTexture_right);         
glBindTexture(GL_TEXTURE_2D, m_uiTexture_right); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, pwr2Width, pwr2Height,0, GL_RGB, GL_UNSIGNED_BYTE, xImageR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glGenBuffers(1, &m_ui32Vbo_rightimage);      
m_ui32VertexStride = 5 * sizeof(GLfloat); // 3 floats for the pos, 2 for the UVs 
glBindBuffer(GL_ARRAY_BUFFER, m_ui32Vbo_rightimage); 
glBufferData(GL_ARRAY_BUFFER, 6 * m_ui32VertexStride, afVertices, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

И мой визуализации (код) выглядит:

//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& LEFT IMAGE &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 
glEnable(GL_STENCIL_TEST); 
glStencilFunc(GL_NOTEQUAL, 1, 1); //draw on uneven lines only 
glUniform1i(glGetUniformLocation(m_uiProgramObject, "sampler2d"), 0); //pass texture unit 0 to shader 
glBindBuffer(GL_ARRAY_BUFFER, m_ui32Vbo_leftimage);  // unbound this near the end of initView, so need to re-bind it 
glEnableVertexAttribArray(VERTEX_ARRAY); 
glVertexAttribPointer(VERTEX_ARRAY, 3, GL_FLOAT, GL_FALSE, m_ui32VertexStride, 0); 
glEnableVertexAttribArray(TEXCOORD_ARRAY); 
glVertexAttribPointer(TEXCOORD_ARRAY, 2, GL_FLOAT, GL_FALSE, m_ui32VertexStride, (void*) (3 * sizeof(GLfloat))); 
glDrawArrays(GL_TRIANGLES, 0, 6); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& RIGHT IMAGE &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 
glEnable(GL_STENCIL_TEST); 
glStencilFunc(GL_EQUAL, 1, 1); //draw on even lines only 
glUniform1i(glGetUniformLocation(m_uiProgramObject, "sampler2d"), 1); 
glBindBuffer(GL_ARRAY_BUFFER, m_ui32Vbo_rightimage); 
glEnableVertexAttribArray(VERTEX_ARRAY); 
glVertexAttribPointer(VERTEX_ARRAY, 3, GL_FLOAT, GL_FALSE, m_ui32VertexStride, 0); 
glEnableVertexAttribArray(TEXCOORD_ARRAY); 
glVertexAttribPointer(TEXCOORD_ARRAY, 2, GL_FLOAT, GL_FALSE, m_ui32VertexStride, (void*) (3 * sizeof(GLfloat))); 
glDrawArrays(GL_TRIANGLES, 0, 6); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

Надеется, что это помогает кто-то когда-нибудь! :)

+1

Выполнение glGetUniformLocation перед каждым обратным вызовом - это пустая трата ресурсов. Вы должны сделать glGetUniformLocation один раз после того, как вы привяжете шейдер, а затем просто обратитесь к этому местоположению. – Jubei