2012-12-04 7 views
0

큐브를 만들 때 텍스처를 적용하려고하면 텍스처가 적용되지 않지만 OpenGL에서 검은 큐브를 반환하면 텍스처가 검정색으로 표시됩니다.OpenGL 텍스처가 표시되지 않습니다.

(I는 QT를 사용하고 있습니다)

는 텍스처 기능 만들기 :

GLuint AOpenGlWidget::textureFromRsc(QString place){ 
// Read the bmp file 
QImage img(place); 
QImage tb; 

QImage fixedImage(img.width(), img.height(), QImage::Format_ARGB32); 
QPainter painter(&fixedImage); 
painter.setCompositionMode(QPainter::CompositionMode_Source); 
painter.fillRect(fixedImage.rect(), Qt::transparent); 
painter.setCompositionMode(QPainter::CompositionMode_SourceOver); 
painter.drawImage(0, 0, img); 
painter.end(); 

tb = QGLWidget::convertToGLFormat(fixedImage); 

GLuint textureId; 
glGenTextures(1,&textureId); 
glBindTexture(GL_TEXTURE_2D,textureId); 

glTexImage2D(GL_TEXTURE_3D,0,4,tb.width(),tb.height(),0,GL_RGBA,GL_UNSIGNED_BYTE,tb.bits()); 

if(!tb.bits()){ 
    QMessageBox::information(0,"Texture loading error.","There was an error while trying to load a texture."); 
} 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 

return textureId; 
} 



PaintGl 기능 :

나는 QT를 사용하고 , 여기에 코드입니다
void AOpenGlWidget::paintGL(){ 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clears the screen and paint the bg with the color specified on glClearColor 



// Another stuff (MVP Matrix... bla bla bla) 

glUseProgram(programId); 

GLuint MatrixId = glGetUniformLocation(programId,"MVP"); 
glUniformMatrix4fv(MatrixId,1,GL_FALSE,glm::value_ptr(MVP)); 
glActiveTexture(cursor_texture); 
glBindTexture(GL_TEXTURE_2D,cursor_texture); 

glUniform1i(glGetUniformLocation(programId,"textura"),cursor_texture); 
// Draw or triangles 

glEnableVertexAttribArray(0); 
glEnableVertexAttribArray(1); 

glBindBuffer(GL_ARRAY_BUFFER,trianglebuffer[0]); 
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,(void*)0); 


glBindBuffer(GL_ARRAY_BUFFER,trianglebuffer[1]); 
glVertexAttribPointer(1,2,GL_FLOAT,GL_FALSE,0,(void*)0); 


glDrawArrays(GL_TRIANGLES,0,12*3); 

glDisableVertexAttribArray(0); 
glDisableVertexAttribArray(1); 
} 

완충액 :
trianglebuffer [1] (UV 좌표 운전)

const GLfloat simple_triangle_buffer_txcoord[] = { 
    0.0f,0.0f, 
    0.0f,1.0f, 
    1.0f,1.0f, 
    1.0f,1.0f, 
    1.0f,0.0f, 
    0.0f,0.0f, 
    0.0f,0.0f, 
    0.0f,1.0f, 
    1.0f,1.0f, 
    1.0f,1.0f, 
    1.0f,0.0f, 
    0.0f,0.0f, 
    0.0f,0.0f, 
    0.0f,1.0f, 
    1.0f,1.0f, 
    1.0f,1.0f, 
    1.0f,0.0f, 
    0.0f,0.0f, 
    0.0f,0.0f, 
    0.0f,1.0f, 
    1.0f,1.0f, 
    1.0f,1.0f, 
    1.0f,0.0f, 
    0.0f,0.0f, 
    0.0f,0.0f, 
    0.0f,1.0f, 
    1.0f,1.0f, 
    1.0f,1.0f, 
    1.0f,0.0f, 
    0.0f,0.0f, 
    0.0f,0.0f, 
    0.0f,1.0f, 
    1.0f,1.0f, 
    1.0f,1.0f, 
    1.0f,0.0f, 
    0.0f,0.0f 
}; 

완충액 :
trianglebuffer [0] (큐브)

const GLfloat simple_triangle_buffer[] = { 
    // Front 
    -1.0f,1.0f,1.0f, 
    -1.0f,-1.0f,1.0f, 
    1.0f,-1.0f,1.0f, 
    1.0f,-1.0f,1.0f, 
    1.0f,1.0f,1.0f, 
    -1.0f,1.0f,1.0f, 

    // Top 
    -1.0f,1.0f,-1.0f, 
    -1.0f,1.0f,1.0f, 
    1.0f,1.0f,1.0f, 
    1.0f,1.0f,1.0f, 
    1.0f,1.0f,-1.0f, 
    -1.0f,1.0f,-1.0f, 

    // Left 
    -1.0f,1.0f,1.0f, 
    -1.0f,1.0f,-1.0f, 
    -1.0f,-1.0f,-1.0f, 
    -1.0f,-1.0f,-1.0f, 
    -1.0f,-1.0f,1.0f, 
    -1.0f,1.0f,1.0f, 

    // Back 
    -1.0f,1.0f,-1.0f, 
    -1.0f,-1.0f,-1.0f, 
    1.0f,-1.0f,-1.0f, 
    1.0f,-1.0f,-1.0f, 
    1.0f,1.0f,-1.0f, 
    -1.0f,1.0f,-1.0f, 

    // Bottom 
    -1.0f,-1.0f,1.0f, 
    1.0f,-1.0f,1.0f, 
    -1.0f,-1.0f,-1.0f, 
    -1.0f,-1.0f,-1.0f, 
    1.0f,-1.0f,1.0f, 
    1.0f,-1.0f,-1.0f, 

    // Right 
    1.0f,1.0f,1.0f, 
    1.0f,-1.0f,1.0f, 
    1.0f,-1.0f,-1.0f, 
    1.0f,-1.0f,-1.0f, 
    1.0f,1.0f,-1.0f, 
    1.0f,1.0f,1.0f 

}; 

그리고 쉐이드 ERS (파편 & 수직) :

// Fragment 
#version 330 core 
out vec3 color; 
in vec2 thcoord; 
in vec2 UV; 
uniform sampler2D d_textura; 
void main(){ 
color = texture(d_textura,thcoord).rgb; 
} 
// Vertex 
#version 330 core 
layout(location = 0) in vec3 vertexPosition_modelspace; 
layout(location = 1) in vec2 tcoord; 
out vec2 thcoord; 
uniform mat4 MVP; 
void main(){ 
vec4 v = vec4(vertexPosition_modelspace,1); 
thcoord=tcoord; 
gl_Position = MVP * v; 
} 

그것은 ...

+0

glTexImage2D 호출이 잘못 되었습니까? glTexImage2D (** GL_TEXTURE_3D **, 0,4, tb.width(), tb.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tb.bits()); ? – JasonD

+0

와아 !! 저것 봐! 그게 다예요, JasonD, 고마워요! 1 정말로 5 시간을 보냈습니다. 나쁜 타이핑 만했습니다 ... (내 문법 때문에 죄송합니다.) :) 감사합니다. 대답을 게시하여 답변으로 표시 할 수 있습니까? – Spamdark

답변

3

이 glTexImage2D 통화가 잘못 나를 UV 좌표를 이해하기 조금 어렵다?

glTexImage2D (GL_TEXTURE_3D, 0,4, tb.width() tb.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tb.bits()); ?

+0

대단히 감사합니다. 지금은 = D로 고정되었습니다. – Spamdark

관련 문제