opengl纹理映射

  • 纹理代码,加载第一个纹理,绑定纹理单元序号,先激活纹理单元再绑定纹理
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);//用于输出纹理目标;参数:生成目标,级别,存储格式(RGB),宽度,高度,图源数据类型(RGB),图源在数组中每一个值的格式格式,数据
        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)
    {
        //因为图片类型为png格式是有透明度的所以参数应该是GL_RGBA
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);//用于输出纹理目标;参数:生成目标,级别,存储格式(RGB),宽度,高度,图源数据类型(RGB),图源在数组中每一个值的格式格式,数据
        glGenerateMipmap(GL_TEXTURE_2D);//自动生成一系列图像(根据远近)
    }
    else
    {
        std::cout << "Failed to load texture" << std::endl;
    }
    stbi_image_free(data);//使用之后就可以释放缓存了

    //一个纹理的位置通常被称为纹理单元
    //一个纹理单元默认位置是0
    myShader->useShader();   //要对shader进行赋值就要使用    
    glUniform1i(glGetUniformLocation(myShader->ID, "ourTexture1"), 0); //给ourTexture1赋值0,这一行可以不需要,因为默认赋值
    glUniform1i(glGetUniformLocation(myShader->ID, "ourTexture2"), 1); //给ourTexture2赋值1
    glActiveTexture(GL_TEXTURE0);   //先激活纹理单元0,这一行可以不需要,因为默认激活
    glBindTexture(GL_TEXTURE_2D, texture[0]);   //再绑定
    glActiveTexture(GL_TEXTURE1);
    glBindTexture(GL_TEXTURE_2D, texture[1]);
    设置边框模式不然就填充了
    //glPolygonMode(GL_FRONT_AND_BACK, /*GL_FILL*/GL_LINE);  //可以设定有没有填充背景颜色(使用纹理加载就不用这个)
}
  • 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);
}

  • main函数运行opengl
int main()
{ 


	init();
	VAOSet();
	Shader myShader;
	texture(&myShader);
	//glPolygonMode(GL_FRONT_AND_BACK,/*GL_FILL*/GL_LINE);
	//渲染引擎
	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);
		
		//glDrawArrays(GL_TRIANGLES,0,6);//画三角
		glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,0);

		glfwPollEvents();
		glfwSwapBuffers(window);
	}
	//退出
	glfwTerminate();
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值