我正在使用OpenGL在我的Android应用程序中渲染游戏视图.游戏是基于回合的,我希望在界面上添加一些按钮.我更喜欢使用标准的Android小部件,以XML生成的布局(或者,如果必须,硬编码布局)构建,并将OpenGL视图作为该布局的一部分放在自己的窗口中.
所以关于这一点,我有3个问题:
1:这样的事情可能吗?我做了几个半心半意的尝试,但到目前为止没有运气.
2:这样的事情是否可取?例如,与使用基于OpenGL的自制软件相比,它是否会带来显着的性能损失?
3:是否可以将特定参数传递给在XML布局中创建的实例?例如,我当前的OpenGL视图在其构造函数中有三个参数; 当它是布局的一部分时,我是否可能以某种方式调用具有特定参数的特定构造函数?
我需要序列化一个综合的应用程序(游戏)状态,通过网络传输或保存到磁盘并在以后检索.
当然,Bundles用于在几个用例中保存/恢复状态,因此使用它们将是理想的.但是,由于某种原因,Bundle不可序列化.
寻找一个解决方案只是出现了将Bundle转变为包裹然后编组的不可接受的黑客攻击,但这不是一个可接受的解决方案,因为无法保证可以在以后或之后解组数据.远程设备.
现在看来,唯一的解决方案似乎是从Bundle获取整个键集,获取每个包含的Object,在每个Object.Class上做一个相当大的开关/ case并手动构建一个巨大的ByteBuffer或类似的这些数据以及大小和类型信息,以便成功地重建另一方的整个事物.
不完全顺利.
有谁知道更好的方法?也许某人已经为Bundle创建了一个实用程序函数来执行此操作?
我对GLSL文档中缺乏明确性以及不同版本中允许,弃用和推荐的内容感到沮丧.
我有一堆片段着色器,我正在用GLSL 1.3版编写.他们工作,但有一个神秘的错误,我怀疑可能会出现,因为我没有指定任何顶点着色器,而是依靠已弃用的gl_TexCoord[i]
变量来获取纹理数据.无论如何,我确实希望以标准和推荐的方式做事.
所以我要问的是:顶点着色器的唯一最小例子是什么,除了在GLSL 1.3中复制关于顶点定位和纹理坐标插值的固定管道功能之外什么都不做,以及如何读取纹理我的片段着色器中的坐标?
我现在的尝试看起来像这样:
// Vertex shader
#version 130
out vec2 texCoord;
void main()
{
gl_Position = vec4(gl_Vertex.xy, 0.0, 1.0);
texCoord = 0.5 * gl_Position.xy + vec2(0.5, 0.5);
}
//Fragment shader
#version 130
in vec2 texCoord;
uniform sampler2D tex;
out vec4 outColor;
void main() {
outColor = texture2D(tex, texCoord.xy);
}
Run Code Online (Sandbox Code Playgroud)
但这并没有给出与简单地省略顶点着色器和替换texCoord相同的结果gl_TexCoord[0]
(事实上,在我的测试中我根本没有输出数据).最重要的是,我的司机抱怨也gl_Vertex
被弃用了!
那么请问,有人可以提供一个符合标准的推荐示例,以便如何简单地完成固定管道在GLSL> = 1.3中的作用吗?如果推荐的方式在1.3以上的版本之间有所不同,我会很感激的例子,如果可能的话也会证明这一点.
如果重要 - 我希望它不重要 - 我的视口设置如下(F#,但代码应该是不言自明的):
GL.Viewport(base.ClientRectangle.X, base.ClientRectangle.Y, base.ClientRectangle.Width, base.ClientRectangle.Height)
let ratio = (float base.ClientRectangle.Height) / (float base.ClientRectangle.Width)
GL.MatrixMode(MatrixMode.Projection) …
Run Code Online (Sandbox Code Playgroud)