OpenGL에서 텍스처를 메시에 적용 할 때 문제가 있습니다. 나는 해결책을 찾기 위해 높고 낮게 보였지만 여러 시간 동안의 연구에서 해결책을 찾지 못했습니다.OpenGL에서 텍스처를 표시 할 수 없습니다.
다른 눈 쌍이 내 코드에서 오류를 잡아낼 수 있기를 바랍니다. 내 쉐이더에서 색상을 설정할 때
모든 것이 잘 작동,하지만 난 그것을 질감을 전달하려고하면로드 된 이미지가 투명 또는
- 완전히 보이지 않는 메쉬를 얻을 수 내 이미지에 실제 색상이 혼합되어 보이는 균일 한 색상의 메쉬 (투명하지 않은 이미지의 경우).
아래 코드는 간단한 사각형을 그리고 텍스처를 적용해야합니다.
이미지 로더 : 나는 데이터를 읽을 수있는 형식으로 이미지 데이터를 출력하여 올바른 이미지 파일이로드 있다는 것을 확인했다
void Texture::loadTexture(const char* _filename)
{
char fn[255] = "assets/textures/";
strcat(fn, _filename);
std::cout << fn << std::endl;
FREE_IMAGE_FORMAT format = FreeImage_GetFileType(fn, 0);
FIBITMAP* bitmap = FreeImage_Load(format, fn);
FIBITMAP* bitmap32 = nullptr;
unsigned int bitsPerPixel = FreeImage_GetBPP(bitmap);
std::cout << "Image BPP: " << bitsPerPixel << std::endl;
int imageWidth = FreeImage_GetWidth(bitmap);
int imageHeight = FreeImage_GetHeight(bitmap);
std::cout << "Image size: " << imageWidth << " x " << imageHeight << std::endl;
if (bitsPerPixel != 32)
bitmap32 = FreeImage_ConvertTo32Bits(bitmap);
else
bitmap32 = bitmap;
BYTE* textureData = FreeImage_GetBits(bitmap32);
//for(int i = 0; i < imageWidth * imageHeight * 4; i += 4) {
// std::cout << (int)textureData[i] << ", " << (int)textureData[i+1] << ", " << (int)textureData[i+2] << ", " << (int)textureData[i+3] << std::endl;
//}
glBindTexture(GL_TEXTURE_2D, m_ID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, imageWidth, imageHeight, 0, GL_BGRA, GL_UNSIGNED_BYTE, (void*)textureData);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
FreeImage_Unload(bitmap);
if (bitsPerPixel != 32)
FreeImage_Unload(bitmap32);
}
. 결과는 예상대로입니다.
내 메인 루프 :
int main()
{
const std::vector<sun::Vertex> vertices = {
sun::Vertex(sun::Vector3f(-4.0f, 4.0f, 0.0f), sun::Vector2f(0.0f, 1.0f)),
sun::Vertex(sun::Vector3f(4.0f, 4.0f, 0.0f), sun::Vector2f(1.0f, 1.0f)),
sun::Vertex(sun::Vector3f(-4.0f, -4.0f, 0.0f), sun::Vector2f(0.0f, 0.0f)),
sun::Vertex(sun::Vector3f(4.0f, -4.0f, 0.0f), sun::Vector2f(1.0f, 0.0f))
};
const std::vector<unsigned int> indices = {0, 1, 2, 1, 3, 2};
sun::Window window("My Game", 1280, 800);
sun::Shader shader("basic.vs", "basic.fs");
sun::Mesh mesh;
sun::Transform transform;
sun::Texture texture;
transform.setProjection(70.0f, window.getWidth(), window.getHeight(), 1.0f, -1000.0f);
mesh.addVertices(vertices, indices);
texture.loadTexture("test2.png");
shader.addUniform("transform");
shader.bind();
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
// Start the main loop
while (!window.closeWindow()) {
// Render
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.3f, 0.8f, 1.0f, 1.0f);
transform.setTranslation(0.0f, 0.0f, 10.0f);
shader.setUniform("transform", transform.getProjectedTransformation());
texture.bind(); // { glBindTexture(GL_TEXTURE_2D, m_ID); }
glEnable(GL_TEXTURE_2D);
mesh.draw(); // See below for details.
glDisable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, 0);
window.update();
}
return 1;
}
mesh.draw() 메서드를 각각
void Mesh::draw()
{
//std::cout << m_Index << std::endl;
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, m_VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (const void*)sizeof(Vector3f));
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_IBO);
glDrawElements(GL_TRIANGLES, m_SizeIndices, GL_UNSIGNED_INT, 0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(0);
}
그리고 마침내, 내 정점과 조각 쉐이더 :
#version 330 core
layout(location = 0) in vec3 position;
layout(location = 1) in vec2 texCoord;
uniform mat4 transform;
out vec2 coords;
void main()
{
gl_Position = transform * vec4(position, 1.0f);
coords = texCoord;
}
#version 330 core
in vec2 coord;
uniform sampler2D sampler;
void main()
{
gl_FragColor = texture2D(sampler, coord.xy);//vec4(1.0f, 0.0f, 0.0f, 1.0f);
}
명 으로는 다음과 같은 OpenGL을 매개 변수를 초기화하는 동안 활성화/설정, 정보를 추가 :
void Window::init()
{
// Set viewport size
glfwGetFramebufferSize(m_Window, &m_Width, &m_Height);
glViewport(0, 0, m_Width, m_Height);
// Set vsync
glfwSwapInterval(0);
// Set face culling and depth test.
glFrontFace(GL_CW);
glCullFace(GL_BACK);
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
// Enable 2D textures
glEnable(GL_TEXTURE_2D);
// Enable gamma correction
glEnable(GL_FRAMEBUFFER_SRGB);
}
어떤 도움을 주시면 감사하겠습니다.
감사합니다.