LearnOpenGl练习题-纹理

LearnOpenGl练习题-纹理

题目地址:纹理 - LearnOpenGL CN

题目一:修改片段着色器,仅让笑脸图案朝另一个方向看:

#version 330 core
out vec4 FragColor;
in vec3 ourColor;
in vec2 TexCoord;

uniform sampler2D texture1;
uniform sampler2D texture2;

void main()
{
   
	FragColor = mix(texture(texture1, TexCoord), texture(texture2, vec2(1.0 - TexCoord.x, TexCoord.y)), 0.2);
}

x坐标从左延伸到右,修改成从右延伸到左,使左右进行转向;

题目二:尝试用不同的纹理环绕方式,设定一个从0.0f2.0f范围内的(而不是原来的0.0f1.0f)纹理坐标。试试看能不能在箱子的角落放置4个笑脸:

将范围设置为0.0f2.0f范围,原图片只占四分之一的位置,通过修改不同的环绕方式能产生不同的效果;

纹理环绕方式:

环绕方式 描述
GL_REPEAT 对纹理的默认行为。重复纹理图像。
GL_MIRRORED_REPEAT 和GL_REPEAT一样,但每次重复图片是镜像放置的。
GL_CLAMP_TO_EDGE 纹理坐标会被约束在0到1之间,超出的部分会重复纹理坐标的边缘,产生一种边缘被拉伸的效果。
GL_CLAMP_TO_BORDER 超出的坐标为用户指定的边缘颜色。

题目三:尝试在矩形上只显示纹理图像的中间一部分,修改纹理坐标,达到能看见单个的像素的效果。尝试使用GL_NEAREST的纹理过滤方式让像素显示得更清晰:

将范围缩小到不足1则会只显示局部纹理,设置过滤为GL_NEAREST使像素边缘更明显;

纹理过滤:

纹理过滤选项 描述
GL_NEAREST(邻近过滤) 选择中心点最接近纹理坐标的那个像素。
GL_LINEAR(线性过滤) 基于纹理坐标附近的纹理像素,计算出一个插值,近似出这些纹理像素之间的颜色。

题目四:使用一个uniform变量作为mix函数的第三个参数来改变两个纹理可见度,使用上和下键来改变箱子或笑脸的可见度:

C++添加代码

float mixValue = 0.2f;
int main()
{
   
    //......
    //激活着色器前
    ourshader.setFloat("mixValue", mixValue);
    //......
    //输入检测后
    ourshader.setFloat("mixValue", mixValue);
}
//根据窗口大小调整视口
void framebuffer_size_callback(GLFWwindow* window, int width, int height) {
   
	//......
}

//检查输入
void processInput(GLFWwindow* window) {
   
	//......
	if (glfwGetKey(window, GLFW_KEY_UP) == GLFW_PRESS)
	{
   
		mixValue += 0.0001f;
		if (mixValue >= 1.0f)
			mixValue = 1.0f;
	}
	if (glfwGetKey(window, GLFW_KEY_DOWN) == GLFW_PRESS)
	{
   
		mixValue -= 0.0001f;
		if (mixValue <= 0.0f)
			mixValue = 0.0f;
	}
}

片段着色器代码:

//添加uniform声明
uniform float mixValue;
void main()
{
   
	FragColor = mix(texture(texture1, TexCoord), texture(texture2, vec2(1.0 - TexCoord.x, TexCoord.y)), mixValue);
}

程序完整代码

  1. 顶点着色器
#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 aColor;
layout(location = 2) in vec2 aTexCoord;
out vec3 ourColor;
out vec2 TexCoord;
void
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jc_caterpillar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值