Единицы текстуры перекрываются?Вынесла неправильную текстуру - PullRequest
0 голосов
/ 05 октября 2018

Я хотел использовать 4 текстуры в своем фрагментном шейдере.Одна представляет собой кубическую карту, другая представляет собой визуализированную текстуру в кадровом буфере, а последние два создаются из изображений.

Когда я пытаюсь вызвать их в своем фрагментном шейдере, я получаю другую, отличную от той, которую я вызывала илиодин и тот же, независимо от того, что я называю (в зависимости от разных итераций, которые я делал, когда пытался это исправить).

Вот как я его получил

GLuint FramebufferName = 0;
glGenFramebuffers(1, &FramebufferName);
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);

GLuint renderedTexture;
glGenTextures(1, &renderedTexture);
glBindTexture(GL_TEXTURE_2D, renderedTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1024, 1024, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, renderedTexture, 0);
GLenum DrawBuffers[1]={GL_COLOR_ATTACHMENT0};
glDrawBuffers(1, DrawBuffers);

if ( glCheckFramebufferStatus ( GL_FRAMEBUFFER ) == GL_FRAMEBUFFER_COMPLETE )
{
  glViewport(0, 0, 1024, 1024);
  glClearColor( 0.4f, 0.4f, 0.4f, 1.0f );
  glClear ( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

  ngl::ShaderLib* shader = ngl::ShaderLib::instance();
  (*shader)["Normal"]->use();
  m_transform.setPosition(0.0f, 0.0f, 0.0f);
  loadMatricesToShader();
  //drawing the quad
  prim->draw("tex");
}

glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(0,0,1024,768);

// grab an instance of the shader manager
ngl::ShaderLib* shader = ngl::ShaderLib::instance();
( *shader )[ "PBR" ]->use();

glUniform1i(renderedTexture, 1);

//initialize environment map
initEnvironment();

initTexture(2, m_glossMapTex, "images/gloss.png");
glUniform1i(m_glossMapTex, 2);
initTexture(3, m_textMap, "images/alege.png");
glUniform1i(m_textMap, 3);

Также initTexture иinitEnvironment

void NGLScene::initTexture(const GLuint& texUnit, GLuint &texId, const char *filename) {

glActiveTexture(GL_TEXTURE0 + texUnit);

// Load up the image using NGL routine
ngl::Image img(filename);

glGenTextures(1, &texId);

glBindTexture(GL_TEXTURE_2D, texId);

glTexImage2D (
            GL_TEXTURE_2D,    
            0,                
            img.format(),   
            img.width(),      
            img.height(),     
            0,                
            GL_RGB,          
            GL_UNSIGNED_BYTE, 
            img.getPixels()); 

// Set up parameters for our texture
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
}

void NGLScene::initEnvironment() {

glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
glActiveTexture (GL_TEXTURE0);
glGenTextures (1, &m_envTex);
glBindTexture(GL_TEXTURE_CUBE_MAP, m_envTex);

initEnvironmentSide(GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, "images/sky_zneg.png");
initEnvironmentSide(GL_TEXTURE_CUBE_MAP_POSITIVE_Z, "images/sky_zpos.png");
initEnvironmentSide(GL_TEXTURE_CUBE_MAP_POSITIVE_Y, "images/sky_ypos.png");
initEnvironmentSide(GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, "images/sky_yneg.png");
initEnvironmentSide(GL_TEXTURE_CUBE_MAP_NEGATIVE_X, "images/sky_xneg.png");
initEnvironmentSide(GL_TEXTURE_CUBE_MAP_POSITIVE_X, "images/sky_xpos.png");

glGenerateMipmap(GL_TEXTURE_CUBE_MAP);

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_AUTO_GENERATE_MIPMAP, GL_TRUE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
GLfloat anisotropy;
glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &anisotropy);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAX_ANISOTROPY_EXT, anisotropy);

// Set our cube map texture to on the shader so we can use it
ngl::ShaderLib *shader=ngl::ShaderLib::instance();
shader->use("PBR");
shader->setUniform("envMap", 0);
}

void NGLScene::initEnvironmentSide(GLenum target, const char *filename) {
// Load up the image using NGL routine
ngl::Image img(filename);

glTexImage2D (
  target,          
  0,                
  img.format(),     
  img.width(),     
  img.height(),    
  0,               
  GL_RGBA,         
  GL_UNSIGNED_BYTE, 
  img.getPixels()   
);
}

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

1 Ответ

0 голосов
/ 05 октября 2018

В вашем коде есть недоразумение, как нужно использовать glUniform1i.Если значения назначены униформе, униформа должна быть идентифицирована по индексу местоположения.См. Uniform (GLSL)

Параметр fist glUniform1i должен быть местоположением униформы, а не именованным объектом текстуры.

Расположение униформы может быть задано явным образом в шейдере с помощью Qualifier Layout

например,

GLSL

layout(location = 7) uniform sampler2D u_gloss;

C ++

initTexture(2, m_glossMapTex, "images/gloss.png");
glUniform1i(7, 2); // uniform location 7

Если местоположение униформы не задано квалификатором макета, то унифицированное местоположение устанавливается автоматически, когда программа связана.Вы можете запросить это местоположение по glGetUniformLocation:

например

GLSL

uniform sampler2D u_gloss;

C ++

GLuint program_obj = ... ; // ( *shader )[ "PBR" ]->???
GLint gloss_location = glGetUniformLocation(program_obj , "u_gloss");

initTexture(2, m_glossMapTex, "images/gloss.png");
glUniform1i(gloss_location, 2);
...