2016-06-13 2 views
1

온라인 검색을 시도했지만 모델에 텍스처를 추가하는 방법을 이해할 수 없었습니다. (처음부터 설정할 수 있습니다.) 문제가 생겼습니다. 코드 수정을 위해 도움이 필요합니다.OpenGL을 사용한 여러 텍스처 매핑

내 텍스처 설정 기능은 다음과 같습니다

void Texture::setTexture(unsigned char* data, unsigned int width, unsigned int height) { 
    glGenTextures(1, &m_texture[unit]); // Genatate 1 texture in m_texture 
    glBindTexture(GL_TEXTURE_2D, m_texture[unit]); 


    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 


    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data); 

내 바인드 기능 :

attribute vec3 position; // Position values 
attribute vec2 texCoord; // Texture coordinates values 
attribute vec3 normal;  // Normal 

varying vec2 texCoord0; 
varying vec3 normal0; 

uniform mat4 transform; 

void main() 
{ 
    gl_Position = transform * vec4(position, 1.0); 
    texCoord0 = texCoord; 
    normal0= (transform * vec4(normal, 0.0)).xyz; 
} 

조각 쉐이더 :

,579,689,619

void Texture::Bind(unsigned int unit) { 
    glActiveTexture(GL_TEXTURE0 + unit); 
    glBindTexture(GL_TEXTURE_2D, m_texture[unit]); 

그리고 내 버텍스 쉐이더는 다음과 같습니다 043,210

쉐이더의 ctor :

내가 처음 텍스처를 사용하는 일부 정점을 선택할 선택합니다
Shader::Shader(const string& fileName) 
{ 
    m_program = glCreateProgram(); 
    m_shaders[0] = CreateShader(LoadShader(fileName + ".vs"), GL_VERTEX_SHADER); 
    m_shaders[1] = CreateShader(LoadShader(fileName + ".fs"), GL_FRAGMENT_SHADER); 

    for (unsigned int i = 0; i < NUM_SHADERS; i++) 
     glAttachShader(m_program, m_shaders[i]); 

    glBindAttribLocation(m_program, 0, "position"); 
    glBindAttribLocation(m_program, 1, "texCoord"); 
    glBindAttribLocation(m_program, 2, "normal"); 

    glLinkProgram(m_program); 

    glValidateProgram(m_program); 

    m_uniforms[TRANSFORM_U] = glGetUniformLocation(m_program, "transform"); 
} 

및 일부 다른 하나. 예를 들어, 각 정사각형의 질감이 다른 큐브입니다.

다른 질감을 어떻게 추가 할 수 있습니까? 그리고 메쉬 수업에서 어떤 변화를 주어야합니까?

바보 같은 질문에 사과드립니다. 저는 OpenGL에서 새로운 것입니다. 미리 감사드립니다!

+0

간단히 말해, 각 유닛마다 하나 이상의 텍스처 유닛을 사용하고 프래그먼트 셰이더의 sampler2D에 매핑해야합니다. 몇몇 훌륭한 정보는 [여기] (http://learnopengl.com/#!Getting-started/Textures)에서 찾을 수 있습니다. –

답변

0

이게 당신이 찾고있는 것인지 모르겠다. 그러나, 여기에 내가 프레 그먼트 쉐이더에서

, 당신은 예를 들어 여러 sampler2D을 사용하는 것입니다 .. 이동 :

uniform sampler2D tex0; 
uniform sampler2D tex1; 

그리고 당신은 C에 약간의 조정을 할 ++ 코드를 너무 너무 좋아 sampler2D 할당이 필요합니다 :

glUniform1i(glGetUniformLocation(shader, "tex0"), 0); 
glUniform1i(glGetUniformLocation(shader, "tex1"), 1); 

01GL_TEXTURE0GL_TEXTURE1에서 활성 질감 수있다. GL_TEXTUREN이면 N이됩니다. 있음을 밝혔다되고 그래서, 당신은 너무처럼 따라 glActiveTexture로 이전하는 텍스처를 결합해야합니다

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, tex0); 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, tex1); 

을 내가 이미 그렇게 생각한다.


아, 그리고 아마 당신은과 같이 조각 쉐이더 너무 배열을 사용할 수 있습니다

uniform sampler2D tex[2]; 

그리고 C++ 코드를 이런 식으로 뭔가 될 것이다 :

for (int i = 0; i < 2; i++) { 
    glUniform1i(glGetUniformLocation(shader, "tex[" + std::to_string(i) + "]"), i); 
} 

편집 : 나는 "tex[" + std::to_string(i) + "]"이 작동하는지 테스트하지 않았습니다. 하지만 당신 생각을하는 것 같아요. 일 수도 있습니다.("tex[" + std::to_string(i) + "]").c_str()

편집 : 배열에 대해 말하자면 텍스처 배열이라고하는 것이 있습니다.더 많은 옵션과 더 많은 옵션을 보려면 this

+0

감사합니다! 첫 번째 텍스처와 다른 텍스처를 사용할 일부 꼭지점은 어떻게 선택합니까? 예를 들어, 각 정사각형의 질감이 다른 큐브입니다. –

+0

@ Yuval.Sightec 아직 시도하지 않았습니다. 그러나 그것이 나라면, 각 꼭지점에 추가 속성을 지정하여 단순성을 위해 어떤 텍스처를 사용해야하는지 결정할 것입니다. 그러나 단순함이 항상 좋은 방법은 아닙니다. 텍스처가 아틀라스를 사용하는 것이 더 쉬운 방법입니다 (텍스처가 그렇게 크지 않은 경우). – Greffin28