큐브를 만들 때 텍스처를 적용하려고하면 텍스처가 적용되지 않지만 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 기능 :
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;
}
그것은 ...
glTexImage2D 호출이 잘못 되었습니까? glTexImage2D (** GL_TEXTURE_3D **, 0,4, tb.width(), tb.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tb.bits()); ? – JasonD
와아 !! 저것 봐! 그게 다예요, JasonD, 고마워요! 1 정말로 5 시간을 보냈습니다. 나쁜 타이핑 만했습니다 ... (내 문법 때문에 죄송합니다.) :) 감사합니다. 대답을 게시하여 답변으로 표시 할 수 있습니까? – Spamdark