在尝试渲染我的 opengl 纹理时,我只得到一个实心四边形,它是我的纹理的基色。
这是我用于加载纹理和渲染/我的着色器的代码
顶点着色器.vert
#version 400 core
in vec3 in_Position;
in vec3 in_Color;
in vec2 in_TextureCoord;
out vec3 pass_Color;
out vec2 pass_TextureCoord;
int main(void) {
pass_Color = in_Color;
pass_TextureCoord = in_TextureCoord;
gl_Position = vec4(in_Position, 1.0);
}
片段着色器.frag
#version 400 core
uniform sampler2D modelTexture;
in vec3 pass_Color;
in vec2 pass_TextureCoord;
out vec4 out_Color;
void main(void) {
out_Color = texture(modelTexture, pass_TextureCoord);
}
纹理加载
glEnable(GL_TEXTURE_2D);
glGenTextures(1, &textureID);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureID);
int channels;
rawPixelData = SOIL_load_image(fileLocation, &width, &height, &channels, SOIL_LOAD_RGB);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, rawPixelData);
glGenerateMipmap(GL_TEXTURE_2D);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glBindTexture(GL_TEXTURE_2D, 0);
std::cout << "========================================" << std::endl;
std::cout << "LOADING TEXTURE: " << fileLocation << std::endl;
std::cout << "========================================" << std::endl;
std::cout << "| Width: " << width << ", Height: " << height << std::endl;
std::cout << "| Channels: " << channels << std::endl;
std::cout << "| Image ID: " << textureID << std::endl;
std::cout << "| Image Data: " << rawPixelData << std::endl;
std::cout << "| RESULT: " << SOIL_last_result() << std::endl;
std::cout << "========================================" << std::endl;
std::cout << "" << std::endl;
SOIL_free_image_data(rawPixelData);
纹理绘图
glEnable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, model->getTexture()->getTextureID());
glUniform1i(glGetUniformLocation(program->getProgramID(), "modelTexture"), 0);
glBindVertexArray(model->getModel()->getVaoID());
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, model->getModel()->getIndiciesVBO());
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
glBindVertexArray(0);
glDisable(GL_TEXTURE_2D);
垂直/指数/颜色阵列
float vertss[12] = { 0.5f, -0.5f, 0.0f,
0.5f, 0.5f, 0.0f,
-0.5f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f};
float color[12] = {1.0f, 0.0f, 0.0f,
0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 1.0f,
1.0f, 1.0f, 0.0f};
//this is my indicies dont question the name =P
unsigned int intPtr[6] = {0, 1, 2,
2, 3, 0};
this->indicies = intPtr;
glGenVertexArrays(1, &vaoID);
glBindVertexArray(vaoID);
glGenBuffers(1, &vertsVBO);
glBindBuffer(GL_ARRAY_BUFFER, vertsVBO);
glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(float), verts, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
unsigned int colorVBO = 0;
glGenBuffers(1, &colorVBO);
glBindBuffer(GL_ARRAY_BUFFER, colorVBO);
glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(float), color, GL_STATIC_DRAW);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
glGenBuffers(1, &this->indiciesVBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indiciesVBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6 * sizeof(unsigned int), indicies, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
//在不同的类
float texCoords[8] = {0.0f, 0.0f,
1.0f, 0.0f,
1.0f, 1.0f,
0.0f, 1.0f};
glBindVertexArray(model->getVaoID());
unsigned int texturesVBO = 0;
glGenBuffers(1, &texturesVBO);
glBindBuffer(GL_ARRAY_BUFFER, texturesVBO);
glBufferData(GL_ARRAY_BUFFER, 8 * sizeof(float), texCoords, GL_STATIC_DRAW);
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
着色器程序的一部分
programID = glCreateProgram();
glAttachShader(programID, vertexID);
glAttachShader(programID, fragmentID);
glBindAttribLocation(programID, 0, "in_Position");
glBindAttribLocation(programID, 1, "in_Color");
glBindAttribLocation(programID, 2, "in_TextureCoord");
glLinkProgram(programID);
glValidateProgram(programID);