无论我尝试什么,我似乎都无法使四边形显示任何纹理,在fragshader中尝试使用纯色效果很好,尝试绘制渐变纹理坐标效果很好..一旦我引入了采样器并尝试设置纹理它不起作用...在下面附加了一些代码和调试详细信息
int width, height, nrChannels;
bool hasAlpha;
unsigned int refID;
glGenTextures(1, &refID);
glBindTexture(GL_TEXTURE_2D, refID);
// set the texture wrapping/filtering options (on the currently bound texture object)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
unsigned char* data = stbi_load("C:\\Users\\shubhz\\source\\repos\\Lumigen\\assets\\textures\\dia.png", & width, & height, & nrChannels, 0);
bool has_alpha = (nrChannels > 3) ? true : false;
if (data) {
if (has_alpha)
glTexImage2D(refID, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
else
glTexImage2D(refID, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
Debug::log("Loaded Texture from :", " w: ", width, " h:", height, " alpha : ", has_alpha, " refID ", refID);
}
else {
//Failed to load texture
Debug::log("Failed to load texture : ");
}
//frees up the tempdata after upload
stbi_image_free(data);
app.initialize();
glUseProgram(Resources::GetShader("default-shader"));
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, refID);
glUniform1i(glGetUniformLocation(Resources::GetShader("default-shader"), "texture1"), 0);
绘图部分:
void SceneRenderer::render(Mesh& _mesh, Material& _mat, glm::mat4 _modelMatrix)
{
glUseProgram(_mat.shader);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, _mat.texture.refID);
glBindVertexArray(_mesh.VAO);
Shader::Mat4f(_mat.shader, "modelMatrix", _modelMatrix);
Shader::Vec4f(_mat.shader, "_MainColor", glm::vec4(0.2f, 0.3f, 0.5f, 1));
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
}
也使用渲染文档打开应用程序,管道查看器中出现这个奇怪的错误,显示 Base_level 0 中的尺寸无效,但我记录了宽度和高度,它们都很好
glTexImage2D()
的第一个参数是target
目标而不是纹理句柄(在您的情况下为refID
)。所以你需要将 refID
替换为 GL_TEXTURE_2D
:
if (has_alpha)
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
else
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
glGetError()
。您至少应该检查 glGetError()
(OpenGL 错误 - OpenGL Wiki)。
更好的设置调试输出。查看LearnOpenGL - 调试以获取更深入的解释。