无法在OpenGL中显示纹理
因此,我在OpenGL中将纹理应用于网格时遇到了一些问题。我到处寻找解决方案,但在许多小时的研究中都没有找到解决方案 我希望另一双眼睛能够捕捉到我代码中的错误 当我在着色器中设置颜色时,一切都很好,但如果我尝试向其传递纹理,则无法在OpenGL中显示纹理,opengl,textures,Opengl,Textures,因此,我在OpenGL中将纹理应用于网格时遇到了一些问题。我到处寻找解决方案,但在许多小时的研究中都没有找到解决方案 我希望另一双眼睛能够捕捉到我代码中的错误 当我在着色器中设置颜色时,一切都很好,但如果我尝试向其传递纹理,则 完全不可见的网格,如果加载的图像具有透明度或 一个颜色均匀的网格,似乎是我的图像中实际颜色的混合(在没有透明度的图像中) 下面的代码绘制一个简单的正方形,并(应该)对其应用纹理 图像加载器: void Texture::loadTexture(const char*
- 完全不可见的网格,如果加载的图像具有透明度或
- 一个颜色均匀的网格,似乎是我的图像中实际颜色的混合(在没有透明度的图像中)
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);
}
作为补充信息,在初始化过程中设置/启用以下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);
}
任何帮助都将不胜感激
谢谢大家! 我发现了我的问题。这表明长时间盯着自己的代码会让你错过最明显的事情 问题出在我的着色器中。顶点着色器正在输出
vec2 coords
但是片段着色器正在等待
vec2 coord
一旦我将变量名更改为匹配,我就得到了我的纹理
#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);
}
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);
}
vec2 coords
vec2 coord