GPU编程入门(6) 效果(effect)基础

ZDNet软件频道时间2008-07-03作者:gamedevers |
本文关键词:effect 效果 GPU

首先是纹理混合的原理,原理就是一个简单的数学公式,

color=sampler1.color×scalar+sampler2.color×(1-scalar)

仔细看就明白是一个线性插值公式,最后的颜色由两个样本的颜色和比例因子决定,下面看程序如何实现

接下来是介绍一个纹理采样器(texture sampler)的概念,采样器(sample)和纹理(texture)也是HLSL语言的一种数据类型,HLSL使用sample对texture进行采样,采样的结果直观的说是颜色 ,具体到HLSL里头就是向量,有采样器有很多种,有1D,2D,3D,CUBE....在以后会陆续用例子程序给介绍,这个例子中用的就是一个2D的sampler.下面是一般的使用方法:

 

texture g_texture;  //声明一个纹理变量

//定义采样器
sampler g_sampler=
sampler_state
{
    Texture 
= <g_texture>;  //关联到纹理
    
    
//设置采样器状态,均采用线性采样方式
    MipFilter = LINEAR;
    MinFilter 
= LINEAR;
    MagFilter 
= LINEAR;
    
}


vector color 
= tex2D(g_sampler,uvCoords);  //调用tex2D()对纹理采样,得到颜色值,供接下来成程序使用

一个纹理是由UV值决定的,也就是纹理的寻址方式。。。这个不用说了吧,不懂只能随便找本图形学方面的书或者说directx的书都能找到的吧。。。

下面就来看像素着色器:

//首先定义全局变量

//比例因子用一个2D向量存储,x=s,y=1-s
vector scalar;
//两个纹理
texture tex0,tex1;

//两个采样器
//定义采样器
sampler sampler0=
sampler_state
{
    Texture 
= <tex0>;  //关联到纹理
    
    
//设置采样器状态,均采用线性采样方式
    MipFilter = LINEAR;
    MinFilter 
= LINEAR;
    MagFilter 
= LINEAR;
    
}
;

//定义采样器
sampler sampler1=
sampler_state
{
    Texture 
= <tex1>;  //关联到纹理
    
    
//设置采样器状态,均采用线性采样方式
    MipFilter = LINEAR;
    MinFilter 
= LINEAR;
    MagFilter 
= LINEAR;
    
}
;

//输入结构,输入两个样本的纹理坐标
struct Input
{
    float2 uvCoord0:TEXCOORD0;
    float2 uvCoord0:TEXCOORD1;
}
;

//输出结构,输出像素颜色即可
struct Output
{
    float4 color:COLOR0;
}
;

//入口函数
Output main(Input input)
{
    Output output 
= (Output)0;
    
//本程序的核心代码,分别取样后混合
    output.color=tex2D(sampler0,input.uvCoord0)*Scalar.x+tex2D(sampler1,input.uvCoord1)*Scalar.y;
    
return output;
}
您看到此篇文章时的感受是:
支持
愤怒
无聊
暴汗
养眼
炒作
不解
标题党
搞笑
用户评论
用户名
评论内容
发表时间
- 发表评论 -
匿名
注册用户

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134