- 纹理代码,加载第一个纹理,绑定纹理单元序号,先激活纹理单元再绑定纹理
void texture(Shader *myShader) {
unsigned char* data;
int width, height, nrChannels;
unsigned int texture[2];
glGenTextures(2, texture);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
data = stbi_load("container.jpg", &width, &height, &nrChannels, 0);
if (data)
{
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
glGenerateMipmap(GL_TEXTURE_2D);
}
else
{
std::cout << "Failed to load texture" << std::endl;
}
stbi_image_free(data);
glBindTexture(GL_TEXTURE_2D, texture[1]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
data = stbi_load("awesomeface.png", &width, &height, &nrChannels, 0);
if (data)
{
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
glGenerateMipmap(GL_TEXTURE_2D);
}
else
{
std::cout << "Failed to load texture" << std::endl;
}
stbi_image_free(data);
myShader->useShader();
glUniform1i(glGetUniformLocation(myShader->ID, "ourTexture1"), 0);
glUniform1i(glGetUniformLocation(myShader->ID, "ourTexture2"), 1);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture[0]);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture[1]);
}
- shader着色,注意uniform sampler2D ourTexture1,使用mix函数进行两个纹理映射
#include "Shader.h"
Shader::Shader(void)
{
const char * vertexShaderSource="#version 400 core\n"
"layout(location=0) in vec3 aPos;\n"
"layout(location=1) in vec2 aTexCoord;\n"
"out vec2 TexCoord;\n"
"void main()\n"
"{\n"
"gl_Position=vec4(aPos.x,aPos.y,aPos.z,1.0f);\n"
"TexCoord=aTexCoord;\n"
"}\n\0";
const char * fragmentShaderSource="#version 400 core\n"
"out vec4 FragColor;\n"
"in vec2 TexCoord;\n"
"uniform sampler2D ourTexture1;\n"
"uniform sampler2D ourTexture2;\n"
"void main()\n"
"{\n"
"FragColor = mix(texture(ourTexture1, TexCoord), texture(ourTexture2, TexCoord),0.2);\n"
"}\n\0";
int vertexShader=glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader,1,&vertexShaderSource,NULL);
glCompileShader(vertexShader);
int fragmentShader=glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader,1,&fragmentShaderSource,NULL);
glCompileShader(fragmentShader);
ID=glCreateProgram();
glAttachShader(ID,vertexShader);
glAttachShader(ID,fragmentShader);
glLinkProgram(ID);
}
void Shader::useShader()
{
glUseProgram(ID);
}
int main()
{
init();
VAOSet();
Shader myShader;
texture(&myShader);
while(!glfwWindowShouldClose(window))
{
glm::mat4 trans=glm::mat4(1.0f);
trans = glm::rotate(trans, (float)glfwGetTime(), glm::vec3(0.0f, 0.0f, 1.0f));
trans=glm::translate(trans,glm::vec3(0.5f,-0.5f,0.0f));
myShader.useShader();
glUniformMatrix4fv(glGetUniformLocation(myShader.ID,"transform"),1,GL_FALSE,
glm::value_ptr(trans));
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,0);
glfwPollEvents();
glfwSwapBuffers(window);
}
glfwTerminate();
return 0;
}