游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4608|回复: 13

如何统一几种不同的着色语言?

[复制链接]

4

主题

28

帖子

28

积分

注册会员

Rank: 2

积分
28
发表于 2011-10-11 10:34:00 | 显示全部楼层 |阅读模式
上头要求在项目中实现几种着色语言的统一,包括HLSL、GLSL还有OpenGL ES,就是说想写一份shader代码,可以在不同的API环境中编译使用,目的是为了跨平台吧……原来我们的代码只是WINDOWS平台,用DirectX,现在上面想进军移动平台了,苦恼……看了几种不同的着色语言,他们的语法都有一定差别……如何才能做到写一份shader代码就可以适用于Direct3D OpenGL OpenGL ES2呢?恳请各位大大赐教,小生在此磕头拜谢!

8

主题

79

帖子

126

积分

注册会员

Rank: 2

积分
126
发表于 2011-10-11 12:25:00 | 显示全部楼层

Re:如何统一几种不同的着色语言?

用CG吧。。。

0

主题

86

帖子

453

积分

中级会员

Rank: 3Rank: 3

积分
453
发表于 2011-10-11 20:36:00 | 显示全部楼层

Re:如何统一几种不同的着色语言?

每种都写呗,到时用那个就调那个,再外面封装一个调用类

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2011-10-12 11:23:00 | 显示全部楼层

Re:如何统一几种不同的着色语言?

自建一种新的shader,都用这个写。然后再写编译转换器,对应不同平台编译转换成对应的。

4

主题

28

帖子

28

积分

注册会员

Rank: 2

积分
28
 楼主| 发表于 2011-10-12 12:49:00 | 显示全部楼层

Re: Re:如何统一几种不同的着色语言?

hyzboy: Re:如何统一几种不同的着色语言?

自建一种新的shader,都用这个写。然后再写编译转换器,对应不同平台编译转换成对应的。


[em17] 编译器对我来说太难了!我问主管,他说写编译转换器一是没人会,二是开发周期太长。请问有没有简单一点的方法啊,如果这位大哥能分享一下您的编译转换器的代码也可以,小生给您磕头了!

59

主题

984

帖子

1200

积分

金牌会员

Rank: 6Rank: 6

积分
1200
发表于 2011-10-12 18:57:00 | 显示全部楼层

Re:如何统一几种不同的着色语言?

要统一的话,就只能自己开发一种类似的脚本或者语言,面对不同的平台生产不同代码.....
开发这样的系统简直就是浪费时间,还不如分别直接针对每个平台写shader来的快,而且面对不同平台,优化肯定是不一样的。只要引擎有统一的接口能在不同平台以相同方式管理shader就够了..

54

主题

2918

帖子

3765

积分

论坛元老

Rank: 8Rank: 8

积分
3765
QQ
发表于 2011-10-12 20:53:00 | 显示全部楼层

Re:如何统一几种不同的着色语言?

LZ还是用3楼的方法吧,保守一点。

4

主题

28

帖子

28

积分

注册会员

Rank: 2

积分
28
 楼主| 发表于 2011-10-13 10:40:00 | 显示全部楼层

Re: Re:如何统一几种不同的着色语言?

Jeminai: Re:如何统一几种不同的着色语言?

LZ还是用3楼的方法吧,保守一点。


这样根本没解决问题

4

主题

28

帖子

28

积分

注册会员

Rank: 2

积分
28
 楼主| 发表于 2011-10-13 10:46:00 | 显示全部楼层

Re: Re:如何统一几种不同的着色语言?

clayman: Re:如何统一几种不同的着色语言?

要统一的话,就只能自己开发一种类似的脚本或者语言,面对不同的平台生产不同代码.....
开发这样的系统简直...


原来这位大大也对开发脚本头痛啊,上学时《编译原理》一定没学好吧,小生昨夜复习了一遍《编译原理》,发现开发一个编译转换器其实并不难,思路是先将代码变成记号流,再处理记号流,把预先定义好的“宏”转换一下即可,换句话说,如果HLSL、GLSL、GLESSL完全支持和C语言功能相同的预处理命令的话,就可以用宏来解决问题了,可惜不完全支持。

4

主题

28

帖子

28

积分

注册会员

Rank: 2

积分
28
 楼主| 发表于 2011-10-13 10:59:00 | 显示全部楼层

Re: 如何统一几种不同的着色语言?

举个例子,现在有如下通用的着色脚本代码:



  1. BEGIN_VERTEX
  2. VERTEX float4 inPosition _POSITION0
  3. VERTEX float2 inTexcoord0 _TEXCOORD0
  4. END_VERTEX

  5. BEGIN_VS_TO_PS
  6. VS_TO_PS float2 Texcoord0 _TEXCOORD0
  7. END_VS_TO_PS


  8. VS_MAIN       
  9. {
  10.         outPosition = gl_ModelViewProjection * inPosition;
  11.         Texcoord0 = inTexcoord0;
  12. }

复制代码


如果采用如下宏定义,那么脚本将被转换为GLSL代码
#define float2 vec2
#define float4 vec4

#define BEGIN_VERTEX
#define END_VERTEX
#define VERTEX attribute

#define BEGIN_VS_TO_PS
#define END_VS_TO_PS       
#define VS_TO_PS varying

#define _POSITION0        ;
#define _TEXCOORD0        ;
#define VS_MAIN void main()
#define outPosition gl_Position

如果采用下面的宏定义,脚本将转换成HLSL

#define BEGIN_VERTEX void main(
#define END_VERTEX
#define VERTEX in

#define BEGIN_VS_TO_PS
#define END_VS_TO_PS       
#define VS_TO_PS out

#define _POSITION0   : POSITION0,       
#define _TEXCOORD0   : TEXCOORD0,       
#define VS_MAIN float4 outPosition : POSITION0 )
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-8 23:17

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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