请教这个手绘树皮纹理怎么画画

本准备先说光照相关实现,但是发现对那个模型实在看不下去了,于是先绘制纹理。
先看下基本纹理贴上去的显示效果。具体模型图请看上篇文章的实现,这篇只讲纹理实现。
我们常见的纹理绘制差不多如下,先写一个纹理坐标,然后是一个顶点坐标,GL.TexCoord2(1.0f,1.0f);GL.Vectex(1.f,1.f,1.f)。先说一下纹理坐标与顶点坐标的对应处理关系,为了好理解,我们只说二维纹理。先看下图。
我们设置一张16*8的纹理,如上图,我们设置GL.TexCoord2(1.0f,1.0f)就是在(16,8)位置,超出1的部分,会复制超出部分,如上图设置GL.TexCoord(2.0,2.0)就会在图上一共显示四张图,同理我们只要纹理的右下部分四分之一,那坐标应该分别是(1,0.5),(0.5,0.5),(0.5,0)(1,0).
在上个模型中,我们可以看到我们有很多的模型需要纹理贴图,如果采用一般的方法,需要在每个立方体的面上去计算我们相应的纹理坐标,这样花费时间太大,这样我们采用opengl里提供的自动生成纹理。首先要指定以什么样的模式(既什么样的算法)来生成纹理坐标。可以指定几种纹理坐标生成模式:GL_OBJECT_LINEAR, GL_EYE_LINEAR, GL_SPHERE_MAP等。
在这里我们只需要采用最容易理解的纹理生成模式。GL_OBJECT_LINEAR,在这种模式下,指定四个参数,p0,p1,p2,p3,对应顶点(x0,y0,z0,w0),生成的纹理坐标为p0*x0+p1*y0+p2*z0+p3*w0。
我们再来看我们的需求
1。要对立方体的各面自动生成纹理。
2。我们贴地面的,要像砖是一块一块的,而贴墙时,只需要贴一张。如最上图所绘,左下角与右上角分别对应的纹理坐标在贴砖是一块一块的应该是((0,0),(n,m))《m&0,n&0》,而贴墙时应该对应((0,0),(1,1))。
借用上篇的图。
第一点,根据我们的p0*x0+p1*y0+p2*z0+p3*w0算法来看,比如贴地面时,也就是垂直于Y轴时,用到的是图上的(4,5,1,0)这个面。
&想象一下对应关系,纹理的S轴坐标对应是1-0这条线,T轴坐标对应的是1-5这条线,那么对应s轴大致如下[x;0.;0.;0],T轴坐标大致如下[0;0.;y;0].各面按照这样得到对应的参数。相关代码如下。
member this.GenTexture(vector:Vector3,ball) =
GL.Enable(EnableCap.TextureGenS)
GL.Enable(EnableCap.TextureGenT)
GL.TexGen(TextureCoordName.S,TextureGenParameter.TextureGenMode,int TextureGenMode.ObjectLinear)
GL.TexGen(TextureCoordName.T,TextureGenParameter.TextureGenMode,int TextureGenMode.ObjectLinear)
let mutable xa = [|1.f;0.f;0.f;0.f|]
let mutable xy = [|0.f;1.f;0.f;0.f|]
let mutable x,y,z=1.f,1.f,0.f
if ball then z &-0.5f
if vector = Vector3.UnitY || vector = -Vector3.UnitY then
if ball then
x&-1.0f/Vector3.Subtract(v8.[0],v8.[1]).Length
y&-1.0f/Vector3.Subtract(v8.[0],v8.[4]).Length
xa &- [|x;0.f;0.f;z|]
xy &- [|0.f;0.f;y;z|]
if vector = Vector3.UnitZ || vector = -Vector3.UnitZ then
if ball then
x&-1.0f/Vector3.Subtract(v8.[0],v8.[1]).Length
y&-1.0f/Vector3.Subtract(v8.[0],v8.[3]).Length
xa &- [|x;0.f;0.f;z|]
xy &- [|0.f;y;0.f;z|]
if vector = Vector3.UnitX || vector = -Vector3.UnitX then
if ball then
x&-1.0f/Vector3.Subtract(v8.[0],v8.[4]).Length
y&-1.0f/Vector3.Subtract(v8.[0],v8.[3]).Length
xa &- [|0.f;0.f;x;z|]
xy &- [|0.f;y;0.f;z|]
GL.TexGen(TextureCoordName.S,TextureGenParameter.ObjectPlane,xa)
GL.TexGen(TextureCoordName.T,TextureGenParameter.ObjectPlane,xy)
其中ball参数表示贴墙这种一面只帖一张纹理。在ball时,我们可以看到我们的p0,p1,p2,p3,p3=0.5,这是因为我的矩形的画法所导致的(前看上篇所叙),比如我要生成宽为8的立方体,其中我画顶点是x=-4,x=4这种画法,如果不加0.5,那么我的帖图就会是左下到右上是(-0,5,-0,5),(0.5,0.5)这种。
在opengl是状态机模式,记的每画一面打开相应的状态后,在画完后,需要关掉,不然会影响下一部分的贴图。绘制部分的代码如下。
member this.DrawTexTure(ts:int*int*bool,vector:Vector3,indexs:int []) =
let ind,txtId,ball = ts
if txtId && 0
GL.BindTexture(TextureTarget.Texture2D,txtId)
this.GenTexture(vector,ball)
GL.Normal3(vector)
GL.DrawElements(BeginMode.Triangles,6,DrawElementsType.UnsignedInt,indexs)
GL.Disable(EnableCap.TextureGenS)
GL.Disable(EnableCap.TextureGenT)
GL.Disable(EnableCap.TextureGenR)
GL.Disable(EnableCap.TextureGenQ)
最后附上源码与可执行文件。操作方式和网游一样,鼠标右键按下加鼠标上下左右移动是视角.EDSF行走。
下一章节会给大家讲到光照的运用。
阅读(...) 评论()微信扫一扫
关注【遇事找法】随时随地获取法律帮助与生活法律热点常识
微信扫一扫关注
您当前位置:
&&&&&&&&&&&&&&&正文
您好,想请教点问题,是这样的,我有一种在漆画形成褶皱纹理的方法(比如想画树枝的时候,形成类似于树枝的
wl1831tfda
您好,想请教点问题,是这样的,我有一种在漆画形成褶皱纹理的方法(比如想画树枝的时候,形成类似于树枝的褶皱),我想咨询下这个方法可以申报发明专利么
黑龙江 哈尔滨 南岗区发表时间: 16:13
尊敬的用户请先登录后解答该咨询。
微律云服务平台
温馨提示:只有认证通过的律师才能回复咨询。
申请专利应当符合“”发明或实用新型,只要符合其中之一即可。
律所:曹学森律师事务所 回复时间: 16:22
回答者将收到好评 好评数已记录
其它回答共 2 条
北京-海淀区
可以申请发明专利。
律所:北京市清华源律师事务所
回复时间: 23:15
回答者将收到好评 好评数已记录
黑龙江-哈尔滨
你好,如果是独创性的,先进性的都可以申请
律所:北京市华泰律师事务所哈尔滨分所
回复时间: 16:19
回答者将收到好评 好评数已记录
专利相关词条:
遇到发明专利问题您可以尝试:
根据您遇到的问题找一个专业律师
根据您遇到的问题看相关法律知识
不用注册,快速回复,马上在线咨询专业律师!
您的问题描述越详细,律师回答越及时越准确~
律师回复后第一时间短信通知您
请输入正确的手机号码
验证码错误!
用户登录 |
记住登录状态
找法推荐律师
吉安优秀律师
相关法律帮助
Copyright@ 版权所有 找法网()- 中国大型法律服务平台&bbs.shuic.net - System Error
Discuz! System Error
已经将此出错信息详细记录, 由此给您带来的访问不便我们深感歉意.话说配图这种黑白渐变纹理怎么用PS画啊....(这张图是我用gr? - 爱问知识人
(window.slotbydup=window.slotbydup || []).push({
id: '2491531',
container: s,
size: '150,90',
display: 'inlay-fix'
啊....(这张图是我用grasshopper代码写出来的(不知道PS上有没有简单点的方法..
,背景那个黑色圆点不说了,直接填充,上面那个白色的渐变大小的圆点可以用渐变+彩色半调
您的举报已经提交成功,我们将尽快处理,谢谢!
要一个图层都渐变的话就直接填充这个图层。知道油漆桶在哪里嘛?渐变和它在一起,你鼠标放久点找找。还有就是图层样式里也有
大家还关注}

我要回帖

更多关于 油画布纹理 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信