libgdx g3d模型漫反射+镜面在vivo xplay等机子上glsl编译不过解决办法
来源:互联网 发布:python刷题原理 编辑:程序博客网 时间:2024/05/01 14:19
Android:
`Vertex shader
ERROR: 0:32: 'a_position' : Only consts can be used in a global initializer
ERROR: 0:70: 'a_normal' : Only consts can be used in a global initializer
ERROR: 0:89: 'a_binormal' : Only consts can be used in a global initializer
ERROR: 0:108: 'a_tangent' : Only consts can be used in a global initializer
ERROR: 0:130: 'a_texCoord0' : Only consts can be used in a global initializer
ERROR: 0:447: ')' : Syntax error: syntax error
ERROR: 6 compilation errors. No code generated.
Fragment shader:
ERROR: 0:206: '(' : Syntax error: syntax error
ERROR: 1 compilation errors. No code generated.
`
我使用的是gdx官方的sample test.glsl,发现在部分手机上,模型的漫反射和镜面无效,查看了一天,并且解决了,有必要分享出来哈,如果用gdx来加载3D模型,需要一些反射镜面光环境映射,模型看起来也会比较生动比较真实一些。
有出现上面的错误日志的,请往下看把哈。
官方g3d glsl地址
https://github.com/libgdx/libgdx/blob/master/tests/gdx-tests-android/assets/data/g3d/shaders/test.glsl
首先解决Only consts can be used in a global initializer:
把 a_position、a_position、a_position、a_tangent、a_texCoord0变量的初始化放到main函数中初始化即可。轻松解决掉5个错误。还剩2个比较棘手。
VS下的'(' : Syntax error: syntax error导致错误原因是 传递参数的时候调用的方法无效,其实我也不知道为啥,调用方法无效,方法已经定义了,为什么无效,无果,只能手动去把这些方法重新在main中实现一下如下代码:
[VS]#include "g_attributes.glsl:VS"#include "u_uniforms.glsl"#include "skinning.glsl"#include "common.glsl:VS"#include "common.glsl:tangentVectorsVS"#include "lights.glsl:lights"varying vec3 v_lightDir;varying vec3 v_lightCol;varying vec3 v_viewDir;varying vec3 v_ambientLight;#ifdef environmentCubemapFlagvarying vec3 v_reflect;#endif void main() {//初始化 #if defined(positionFlag) g_position = vec4(a_position, 1.0); #elseg_position = vec4(0.0, 0.0, 0.0, 1.0); #endif #if defined(normalFlag)g_normal = a_normal; #elseg_normal = vec3(0.0, 0.0, 1.0); #endif #if defined(binormalFlag) g_binormal = a_binormal; #else g_binormal = vec3(0.0, 1.0, 0.0); #endif // binormalFlag#if defined(tangentFlag) g_tangent = a_tangent;#else g_tangent = vec3(1.0, 0.0, 0.0);#endif // tangentFlag#if defined(texCoord0Flag) g_texCoord0 = a_texCoord0;#else g_texCoord0 = vec2(0.0, 0.0);#endif // texCoord0FlagcalculateTangentVectors();g_position = applySkinning(g_position);g_normal = normalize(u_normalMatrix * applySkinning(g_normal));g_binormal = normalize(u_normalMatrix * applySkinning(g_binormal));g_tangent = normalize(u_normalMatrix * applySkinning(g_tangent));g_position = u_worldTrans * g_position;gl_Position = u_projViewTrans * g_position;mat3 worldToTangent;worldToTangent[0] = g_tangent;worldToTangent[1] = g_binormal;worldToTangent[2] = g_normal;v_ambientLight = getAmbient(g_normal);v_lightDir = normalize(-u_dirLights[0].direction) * worldToTangent;v_lightCol = u_dirLights[0].color;vec3 viewDir = normalize(u_cameraPosition.xyz - g_position.xyz);v_viewDir = viewDir * worldToTangent;#ifdef environmentCubemapFlagv_reflect = reflect(-viewDir, g_normal);#endif//pushColor();//pushTexCoord0();//fix v_color=g_color; v_texCoord0=g_texCoord0;}
FS中错误点,相对多一点,
// pullColor();// pullTexCoord0();
// diffuse = applyColorDiffuse(g_color);
// vec3 specular = fetchColorSpecular();
同理,需要重新实现这几个方法如下代码:g_color = v_color; g_texCoord0 = v_texCoord0; vec4 diffuse; //diffuse = applyColorDiffuse(g_color); #if defined(diffuseTextureFlag) || defined(diffuseColorFlag) vec4 fetchDiffuse; #if defined(diffuseTextureFlag) && defined(diffuseColorFlag) fetchDiffuse=(texture2D(u_diffuseTexture, g_texCoord0) * u_diffuseColor); #elif defined(diffuseTextureFlag) fetchDiffuse= (texture2D(u_diffuseTexture, g_texCoord0)); #elif defined(diffuseColorFlag) fetchDiffuse=u_diffuseColor; #else fetchDiffuse= vec4(1.0); #endif diffuse= g_color * fetchDiffuse; #else diffuse=g_color; #endif //fix vivo xplay6 bug //vec3 specular = fetchColorSpecular(); vec3 specular; //g_texCoord0, vec3(0.0) #if defined(specularTextureFlag) && defined(specularColorFlag) specular= (texture2D(u_specularTexture, g_texCoord0).rgb * u_specularColor.rgb); #elif defined(specularTextureFlag) specular=texture2D(u_specularTexture, g_texCoord0).rgb; #elif defined(specularColorFlag) specular=u_specularColor.rgb; #else specular= vec3(0.0); #endif
到此BUG就修复完成,gdx 3d模型加载,不知道还会不会碰到更多的BUG,真心痛苦,后面碰到再说了。
- libgdx g3d模型漫反射+镜面在vivo xplay等机子上glsl编译不过解决办法
- Scribe在CentOS 5.8和6.4上编译不过的解决办法
- Mac编译G3D
- opengl示例代码在vs上编译不过
- C++程序放在别的机子上出现“应用程序未能启动”等错误。
- OpenGL 4.0 GLSL 用单光源 实现逐顶点 漫反射光照模型
- VS2008编译的mfc程序在没有安装的机子上运行的问题
- VS编译的程序在其他机子上显示MSVCP110D.DLL丢失问题
- 对于Debug编译的exe无法在未安装vs2013的机子上运行解决方法
- 在Android机子上进行AssetBundle 读取
- AssetBundle 在Android机子上进行读取
- 步步高 vivo Xplay X510w 拆机全图解 欢迎围观
- vivo Xplay(16GB) root教程_方法
- Android源码编译 首发ViVo Xplay X510w 2.14.8 完美root/美颜相机/状态栏美化/支持官方OTA/纯净,稳定ROM
- 关于工程编译不过等奇葩问题
- make出错,编译通不过的解决办法
- cocos2d使用websocket,编译不过,解决办法
- Android 5.1 Gallery2 模块编译不过解决办法
- caffe训练自己的图片分类模型
- java反射机制的作用
- 多进程,Request+正则表达式爬取榜单类网站
- iOS开发中的单选与多选
- gcd 实际例子编写
- libgdx g3d模型漫反射+镜面在vivo xplay等机子上glsl编译不过解决办法
- 如何使用logcat记录所有页面的加载时间
- java 字符串 分割 split 方法
- java系统高并发解决方案
- 消息中间件mq处理分布式事务
- 反射获取类的所有属性包括父类
- quick-cocos2d-x开发工具sublime text及其强力插件QuickXDev
- python 爬取西刺免费代理ip 并使用telnetlib.Telnet验证是否有效
- Linux进程预习二