游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5263|回复: 10

用顶点和像素着色器实现3d卡通渲染的问题~

[复制链接]

51

主题

145

帖子

152

积分

注册会员

Rank: 2

积分
152
发表于 2008-4-13 13:00:00 | 显示全部楼层 |阅读模式
我是看的翁版的3d游戏程序设计入门~ 里面设计到着色器的使用 也有一些现成的例子 比如卡通渲染等 通过分析里面的例子 我也对卡通渲染有了大概的了解(也就是使用很少的着色亮度和使轮廓边加粗) 但是 他的例子是用D3DXCreateTeapot创建一个茶壶 然后赋给茶壶简单的红色 也没有任何的纹理贴图 但是我现在所做的模型是有不同的贴图的 而且模型比较复杂 这样的话 用他原先的程序渲染出来的模型 就是一团杂乱的黑线交织在一起 怎么解决这个问题呢~

201

主题

1437

帖子

1963

积分

金牌会员

Rank: 6Rank: 6

积分
1963
QQ
发表于 2008-4-13 17:59:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

51

主题

145

帖子

152

积分

注册会员

Rank: 2

积分
152
 楼主| 发表于 2008-4-14 21:02:00 | 显示全部楼层

Re: Re:用顶点和像素着色器实现3d卡通渲染的问题~

niexuchina: Re:用顶点和像素着色器实现3d卡通渲染的问题~

贴个图看看吧。


恩 好的 顺便趁这个机会说说卡通渲染的话题吧

是这样~ 卡通渲染主要分为两个阶段:

第一个是使用带强度级别的灰度纹理,也就是物体表面光度的变化是“突然的”而不是连续的。下图是使用d3dxcreateteapot创建的一个茶壶模型,并且使用了卡通渲染的第一步:



第二步是轮廓勾边,下图是茶壶的轮廓勾边:



然后综合起来的图是这样的:



这样很好,然而这是对于d3dxcreateteapot创建出来的图形而言,我现在用3dmax做了一个现成的茶壶,然后导出.x文件,再使用D3DXLoadMeshFromX函数导入后渲染的效果却是这样。下图是带强度级别的无轮廓图:



上面这个看着还差不多,下面看看整体的:



ps:模糊是截图造成的,去了材质和贴图就是这样了;



现汗一个~ 请教有没有遇到过这种情况的朋友或者对卡通渲染方面有研究的朋友指点一下~谢谢啦

51

主题

145

帖子

152

积分

注册会员

Rank: 2

积分
152
 楼主| 发表于 2008-4-15 21:29:00 | 显示全部楼层

Re:用顶点和像素着色器实现3d卡通渲染的问题~

没人知道吗~

51

主题

145

帖子

152

积分

注册会员

Rank: 2

积分
152
 楼主| 发表于 2008-4-16 07:39:00 | 显示全部楼层

Re:用顶点和像素着色器实现3d卡通渲染的问题~

继续自问自答~ 我编了一个函数 输出mesh的vertexbuffer,indexbuffer和adjacentbuffer 所以我对使用D3DXCreat***函数创建的立方体mesh和使用D3DXLoadMeshFromX载入的立方体进行对比,信息如下:

D3DCreateBox的:

Vertices:
---------

Vertex 0: (-1, -1, -1, -1, 0, 0)
Vertex 1: (-1, -1, 1, -1, 0, 0)
Vertex 2: (-1, 1, 1, -1, 0, 0)
Vertex 3: (-1, 1, -1, -1, 0, 0)
Vertex 4: (-1, 1, -1, 0, 1, 0)
Vertex 5: (-1, 1, 1, 0, 1, 0)
Vertex 6: (1, 1, 1, 0, 1, 0)
Vertex 7: (1, 1, -1, 0, 1, 0)
Vertex 8: (1, 1, -1, 1, 0, 0)
Vertex 9: (1, 1, 1, 1, 0, 0)
Vertex 10: (1, -1, 1, 1, 0, 0)
Vertex 11: (1, -1, -1, 1, 0, 0)
Vertex 12: (-1, -1, 1, 0, -1, 0)
Vertex 13: (-1, -1, -1, 0, -1, 0)
Vertex 14: (1, -1, -1, 0, -1, 0)
Vertex 15: (1, -1, 1, 0, -1, 0)
Vertex 16: (-1, -1, 1, 0, 0, 1)
Vertex 17: (1, -1, 1, 0, 0, 1)
Vertex 18: (1, 1, 1, 0, 0, 1)
Vertex 19: (-1, 1, 1, 0, 0, 1)
Vertex 20: (-1, -1, -1, 0, 0, -1)
Vertex 21: (-1, 1, -1, 0, 0, -1)
Vertex 22: (1, 1, -1, 0, 0, -1)
Vertex 23: (1, -1, -1, 0, 0, -1)


Indices:
--------

Face 0: 0 1 2
Face 1: 2 3 0
Face 2: 4 5 6
Face 3: 6 7 4
Face 4: 8 9 10
Face 5: 10 11 8
Face 6: 12 13 14
Face 7: 14 15 12
Face 8: 16 17 18
Face 9: 18 19 16
Face 10: 20 21 22
Face 11: 22 23 20

D3DLoadMeshFromFile的:

Vertices:
---------

Vertex 0: (-1, -1, -1, 0, 0, -1)
Vertex 1: (1, 1, 1, -1, -1, 0)
Vertex 2: (0, -1, 0, 1, -1, 1)
Vertex 3: (-1, 0, 0, -1, 1, 0)
Vertex 4: (1, 1, -1, 0, 0, -1)
Vertex 5: (0, 0, -1, -1, 1, 0)
Vertex 6: (0, 1, 0, 1, 1, -1)
Vertex 7: (1, 0, 0, 1, 1, 1)
Vertex 8: (-1, 1, 1, 0, 0, 1)
Vertex 9: (0, 0, 1, 1, 1, 0)
Vertex 10: (0, 1, 1, 0, -1, -1)
Vertex 11: (-1, 0, -1, 0, 0, 1)
Vertex 12: (1, -1, -1, 0, -1, 0)
Vertex 13: (1, 1, 1, -1, 1, 0)
Vertex 14: (-1, 0, 1, 0, -1, -1)
Vertex 15: (1, 0, -1, 0, 0, 0)
Vertex 16: (1, 1, -1, 1, 0, 0)
Vertex 17: (1, 1, 1, -1, 1, 1)
Vertex 18: (0, 0, 0, 0, 1, 1)
Vertex 19: (-1, 0, 1, 0, 0, 1)
Vertex 20: (-1, 1, -1, 0, 1, 0)
Vertex 21: (1, 1, -1, 1, 1, 0)
Vertex 22: (1, 0, 1, 0, 1, 1)
Vertex 23: (1, 0, 1, 0, 0, 0)


Indices:
--------

Face 0: 0 2 3
Face 1: 3 1 0
Face 2: 4 5 7
Face 3: 7 6 4
Face 4: 8 9 10
Face 5: 10 11 8
Face 6: 20 12 21
Face 7: 21 13 20
Face 8: 14 15 16
Face 9: 16 17 14
Face 10: 18 22 19
Face 11: 19 23 18

PS:顶点坐标后三位是法线向量。
经过对比法线虽然两个mesh的vertices数量和face数量相同,但是我试着按照这两个buffer重新构成一下对应的立方体,发现D3DXCreateBox创建的立方体可以被准确的构造出来,而Load进的立方体构造出的face非常混乱。是不是在导出.x文件时影响了buffer们的准确性呢。

201

主题

1437

帖子

1963

积分

金牌会员

Rank: 6Rank: 6

积分
1963
QQ
发表于 2008-4-16 20:55:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

51

主题

145

帖子

152

积分

注册会员

Rank: 2

积分
152
 楼主| 发表于 2008-4-16 21:50:00 | 显示全部楼层

Re: Re:用顶点和像素着色器实现3d卡通渲染的问题~

niexuchina: Re:用顶点和像素着色器实现3d卡通渲染的问题~

图看不见。


恩 好的 顺便趁这个机会说说卡通渲染的话题吧

是这样~ 卡通渲染主要分为两个阶段:

第一个是使用带强度级别的灰度纹理,也就是物体表面光度的变化是“突然的”而不是连续的。下图是使用d3dxcreateteapot创建的一个茶壶模型,并且使用了卡通渲染的第一步:



第二步是轮廓勾边,下图是茶壶的轮廓勾边:



然后综合起来的图是这样的:



这样很好,然而这是对于d3dxcreateteapot创建出来的图形而言,我现在用3dmax做了一个现成的茶壶,然后导出.x文件,再使用D3DXLoadMeshFromX函数导入后渲染的效果却是这样。下图是带强度级别的无轮廓图:



上面这个看着还差不多,下面看看整体的:



ps:模糊是截图造成的,去了材质和贴图就是这样了;



现汗一个~ 请教有没有遇到过这种情况的朋友或者对卡通渲染方面有研究的朋友指点一下~谢谢啦

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2008-4-17 09:41:00 | 显示全部楼层

Re:用顶点和像素着色器实现3d卡通渲染的问题~

图还是看不见......................

1

主题

57

帖子

59

积分

注册会员

Rank: 2

积分
59
QQ
发表于 2008-4-24 10:01:00 | 显示全部楼层

Re:用顶点和像素着色器实现3d卡通渲染的问题~

    要既有纹理又有卡通渲染的效果的话,就要用到至少两层纹理,而且两层纹理的UV坐标是不一样的.贴图纹理层用的是模型导出时的UV坐标,这个坐标是不变的.阴影层纹理的UV坐标是根据光照的方向和物体顶点法线的夹角,实时计算出来的.最后要选择好两层纹理的.
    另外你的问题描述得不够详细. 如果你是用3dsmax直接使用导出.x文件的话,出问题的可能性太多了,因为3dsmax的右手空间坐标系的,而d3d的是左手空间坐标系,在导出模型时勾选不同的选项会有不同的可能.建议你还是自己写个maxscript来导出模型

0

主题

34

帖子

34

积分

注册会员

Rank: 2

积分
34
发表于 2008-4-24 15:54:00 | 显示全部楼层

Re:用顶点和像素着色器实现3d卡通渲染的问题~

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 11:14

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表