| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 956 人关注过本帖
标题:OpenGL|ES Shader代码量逐渐增大,在执行glLinkProgram时返回GL_FALSE,用g ...
只看楼主 加入收藏
jonyguo
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-3-8
收藏
 问题点数:0 回复次数:1 
OpenGL|ES Shader代码量逐渐增大,在执行glLinkProgram时返回GL_FALSE,用glGetProgramiv获取不到错误信息。
直奔主题,Shader代码流程大致如下:
float processTree(这里传入19个参数)
{
    // 根据参数多次利用texture2D获取texture像素值
    // 将这些获取到的像素值做一些float类型运算
    // 得到一个返回值并返回
}
int stage0(float tmp)
{
    float sum += processTree(...);
    float sum += processTree(...);
    float sum += processTree(...);
    float sum += processTree(...);
    float sum += processTree(...);
    float sum += processTree(...);
    float sum += processTree(...);
    float sum += processTree(...);
    float sum += processTree(...);
    float sum += processTree(...);
    ......
    // 用sum和tmp进行比较,然后返回0或1
}
void main()
{
    stage0(...);
}

代码编译没有报错,Shader编译也没有报错:
1. 当stage0中porcessTree的调用次为50次时,Shader进行link时没有报错,程序可以正确执行;
2. 当stage0中porcessTree的调用次为60次时,Shader的link过程报错,程序结束,但是用glGetProgramiv获取不到错误信息,错误信息为空。

给人的感觉就是OpenGL|ES好像是有某些限制,但是我们又不知道,导致在处理达到一定次数时,link就报错了。

有没有兄弟遇到过同样的问题,或是有自己的看法,欢迎大家回复。
找到出现这个问题的真正原因。

PS:已经被这个问题折腾了2个礼拜了,求高手解答。
搜索更多相关主题的帖子: 信息 主题 
2013-03-08 16:51
jonyguo
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-3-8
收藏
得分:0 
请教专家后得到如下结果:
1. OpenGL|ES在编译、link程序时,会将自定义函数按照宏定义全部展开,那么可执行程序所包含的指令会变得很大,而对程序而言,自身占用堆栈大小是有限制的,所以导致堆栈大小占用超过了限制,Link失败。
2. 换句话说,就是OpenGL|ES对整个代码的规模(这个包括运算量、指令数等因素)是有限制的。因为我们的计算量比较大,所以导致超过了限制。

解决办法:
可以将在单个Fragment Shader里面的计算量分拆到多个Fragment Shader中去完成,但这肯定会影响效率。
2013-03-27 10:04
快速回复:OpenGL|ES Shader代码量逐渐增大,在执行glLinkProgram时返回GL_FALSE ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019229 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved