彻底了解渲染流程,drawcall,material,materialInstance:自己写个引擎(一)

目的:

SDL_Image,d3d9与OpenGL Shader混用方法(一)的”结果“。

在OpenGL+SDL2的环境下实现能采用不同shader的图片。

为实现此目标,已经基本脱离SDL,到了自己写引擎的地步。

在自己实现GL引擎的过程中,对渲染流程,drawcall,material和materialInstance有了更为深刻的体会,在此分享一下。

(图1:背景图使用不断改变tex的shader1,蓝图使用了将图片扭成漩涡的shader2)

背景图Shader:

//quad.vs
in vec2 LVertexPos2D;
in vec2 inTexCoord2D;
varying vec2 texCoord2D;
void main()
{
	texCoord2D = inTexCoord2D;
	gl_Position = vec4( LVertexPos2D.x, LVertexPos2D.y, 0, 1 );
}

//quad.fs
uniform sampler2D tex; 
varying vec2 texCoord2D;
void main() 
{ 
	vec4 finalColor = texture(tex, texCoord2D);
	gl_FragColor = vec4(finalColor.b,finalColor.g,finalColor.r,1.0f); 
}

漩涡Shader:

//vortex.vs
in vec2 LVertexPos2D;
in vec2 inTexCoord2D;
varying vec2 texCoord2D;
void main()
{
	texCoord2D = inTexCoord2D;
	gl_Position = vec4( LVertexPos2D.x, LVertexPos2D.y, 0, 1 );
}

//vortex.fs
uniform sampler2D tex; 
uniform float maxTheta; 
varying vec2 texCoord2D;
void main() 
{ 
	float pi = 3.1415926f; 
	float maxRho2 = 0.5f; 
	float thetaMin = 0.0f; 
	float thetaMax = maxTheta; 
	float u = texCoord2D.x-0.5f; 
	float v = texCoord2D.y-0.5f; 
	float rho2 = u*u+v*v; 
	float theta = mix(thetaMin,thetaMax,rho2/maxRho2) ;
	float s = sin(theta); 
	float c = cos(theta); 
	float u0 = c*u+s*v; 
	float v0 = -s*u+c*v;  
	vec2 uv0 = vec2(u0+0.5,v0+0.5); 
	vec4 finalColor = texture(tex, uv0);
	gl_FragColor = vec4(finalColor.r,finalColor.g,finalColor.b,1.0f); 
}

 

参考:

1.LazyFoo关于OpenGL的教程:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值