标签: opengl-es

使用带有android xml布局的GLSurfaceView类

我想利用android xml布局.我在框架布局中放置了一个glSurfaceView,以便与线性布局结合使用......

<FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1">

<android.opengl.GLSurfaceView android:id="@+id/surfaceviewclass"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

</FrameLayout>

<LinearLayout android:id="@+id/gamecontrolslayout"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:layout_weight="5"
          android:background="@drawable/backdrop"> 
//some layout stuff

</LinearLayout>
<LinearLayout>
Run Code Online (Sandbox Code Playgroud)

然后我就像这样调用我的布局

setContentView(R.layout.main);
    GLSurfaceView glSurfaceView = (GLSurfaceView)findViewById(R.id.surfaceviewclass);
Run Code Online (Sandbox Code Playgroud)

在onCreate();

我怎样才能调用我的glSurfaceView以便我可以使用这样的xml布局并引用我自己的GLSurfaceView类(下面是引用我自己的GLSurfaceView类的代码)...

glSurfaceView = new MyGLSurfaceView(this);
    setContentView(glSurfaceView);
Run Code Online (Sandbox Code Playgroud)

无论如何将这两者结合起来?我想这样做因为我在我的glSurfaceView类中有很多东西,比如文件加载和触摸事件.而且我只想到实现这个新布局

java android opengl-es glsurfaceview android-layout

13
推荐指数
1
解决办法
2万
查看次数

将部分纹理(精灵表/纹理贴图)应用于iOS OpenGL ES 2.0中的点精灵

看起来这应该很简单,但是使用点精灵的部分纹理我遇到了很多困难.我已经广泛搜索并提出了各种答案,但这些都没有解决我遇到的具体问题.

到目前为止我学到了什么:

  1. 点精灵绘图的基础知识
  2. 如何处理点精灵呈现为实心方块
  3. 如何改变点精灵的方向
  4. 如何使用点精灵多个纹理,在这里越来越近..
  5. 那点精灵+精灵表已经完成,但只能在OpenGL ES 2.0(不是1.0)中完成

这是我想要实现的图表

点精灵图

我在哪里:

  • 我有一组工作点精灵都使用相同的单个方形图像.例如:16x16的圆形图像效果很好.
  • 我有一个Objective-C方法,它生成一个包含带有多个图像的精灵表的600x600图像.我已经通过将整个精灵表单图像应用于使用GL_TRIANGLES绘制的四边形来验证这是有效的.
  • 我已成功使用上述方法将精灵表的部分绘制到四边形上.我不能让它与点精灵一起工作.
  • 目前我正在生成指向我正在定位的精灵表上的精灵中心的纹理坐标.例如:使用底部的图像; 明星:0.166,0.5; 云:0.5,0.5; 心脏:0.833,0.5.

码:

顶点着色器

uniform mat4 Projection;
uniform mat4 Modelview;
uniform float PointSize;

attribute vec4 Position;
attribute vec2 TextureCoordIn;

varying vec2 TextureCoord;

void main(void)
{
    gl_Position = Projection * Modelview * Position;
    TextureCoord = TextureCoordIn;
    gl_PointSize = PointSize;
}
Run Code Online (Sandbox Code Playgroud)

片段着色器

varying mediump vec2 TextureCoord;
uniform sampler2D Sampler;

void main(void)
{
    // Using my TextureCoord just draws a grey square, so
    // I'm likely …
Run Code Online (Sandbox Code Playgroud)

opengl-es glsl ios opengl-es-2.0

13
推荐指数
2
解决办法
8798
查看次数

如何在iPhone/iPad游戏中测量和改善电池使用(Android也)

我的游戏使用了太多电池.与同类游戏相比,我不确切知道它使用了多少,但它使用了太多.玩家抱怨它使用了很多,其中一些人注意到它使他们的设备"运行热".我刚刚开始研究这个问题,并想提出一些理论和实际问题来缩小搜索范围.这主要是关于我的游戏的iOS版本,但可能许多相同的问题影响Android版本.很抱歉要问很多子问题,但它们似乎都是相互关联的,我认为最好把它们放在一起.

附注:我的游戏不进行网络访问(在几个地方称为大电池耗尽)并且在后台不消耗大量电池; 它是前台运行的问题.

(1)我知道有API可以读取电池电量,所以我可以做一些自动化测试.我的问题是:关于需要多长时间(或者可能:大约耗费多少电量)我需要让物品运行以获得可靠的读数?例如,如果它运行10分钟是可靠的吗?如果它排出10%的电池,那可靠吗?或者运行更长时间更好(或者说,看看电池耗电50%需要多长时间)?我在这里问的是电池表的灵敏度/可靠性,所以我知道每次测试需要多长时间.

(2)我试图了解电池使用率高的可能原因.下面列出一些可能的因素.请帮助我了解哪些是最有可能的罪魁祸首:

(2a)和很多游戏一样,我的游戏需要在每个帧上绘制全屏.它的运行速度约为30 fps.我知道Apple说"只需要根据需要刷新屏幕",但我几乎需要绘制每一帧.实际上,我可以将一些工作只绘制到已经改变的屏幕部分,但在我的情况下仍然是屏幕的大部分.在任何情况下,即使我可以将绘图本地化到屏幕的一部分,我仍然每秒进行30次OpenGL交换缓冲区调用,所以我努力画得少一点真的很重要?

(2b)当我绘制屏幕元素时,会有一定量的浮点数学运算(例如,在计算纹理UV坐标中),以及一些(较少)双精度数学运行.与类似的整数运算相比,我不知道它们在电池方面有多贵.我可能会缓存很多这些值而不必重复计算它们,如果那可能是胜利的话.

(2c)渲染场景时,我会进行一定量的纹理切换.我以前只是担心这会使游戏太慢(它没有),但现在我也想知道减少纹理切换是否会减少电池的使用.

(2d)我不确定这对我来说是否实用,但是:我一直在阅读着色器和OpenCL,我想了解我是否要将一些CPU处理卸载到GPU,这是否可能节省电池(除了可能为矢量型操作运行速度更快).或者它可能会在GPU上使用比CPU更多的电池?

我意识到我可以通过禁用游戏的某些部分并进行迭代电池测试运行来缩小哪些因素在起作用(因此问题的第(1)部分).只是因为禁用并不是微不足道的,并且有足够的潜在罪魁祸首,我认为我首先会要求提供一般建议.

android opengl-es power-management ios

13
推荐指数
1
解决办法
1372
查看次数

具有透明背景的OpenGL ES 2.0 GLKit

有没有办法让GLKView的背景透明?我在这里尝试了解决方案,但这对我不起作用.

*编辑:我需要帮助使它完全透明.背景主要是白色和灰色,但我只是用更鲜艳的色彩测试它,当然你可以模糊地看到背景.任何想法为什么它将部分透明但不完全使用以下代码?

这是我的视图控制器中的代码:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.context = [[[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2] autorelease];
    CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.view.layer;
    eaglLayer.opaque = NO;

    if (!self.context) {
       NSLog(@"Failed to create ES context");
    }

    GLKView *view = (GLKView *)self.view;
    view.context = self.context;

    view.backgroundColor = [UIColor clearColor];

    view.drawableDepthFormat = GLKViewDrawableDepthFormat24;

    [self setupGL];
}

- (void)setupGL
{
    [EAGLContext setCurrentContext:self.context];

    self.effect = [[[GLKBaseEffect alloc] init] autorelease];
    self.effect.light0.enabled = GL_FALSE;
    self.effect.light0.diffuseColor = GLKVector4Make(1.0f, 0.4f, 0.4f, 0.0f);
    self.effect.light0.ambientColor = GLKVector4Make(1.0f, 0.4f, 0.4f, 0.0f);

    glDisable(GL_DEPTH_TEST); …
Run Code Online (Sandbox Code Playgroud)

iphone opengl-es ios glkit

13
推荐指数
2
解决办法
8416
查看次数

逻辑缓冲区加载 - 慢帧缓冲加载 - ios

我们试图弄清楚为什么我们在iphone 4和ipad 1上的FPS相对较慢.我们在开放式GL分析中看到了这类警告:逻辑缓冲区负载.摘要是"慢帧缓冲加载".建议说在渲染之前必须由GPU加载帧缓冲.它建议我们无法在每帧的开头执行全屏清除操作.但是,我们正在使用glClear.

[EAGLContext setCurrentContext:_context];

glBindFramebuffer(GL_FRAMEBUFFER, _defaultFramebuffer);
glClear(GL_COLOR_BUFFER_BIT);

// Our OpenGL Drawing Occurs here
Run Code Online (Sandbox Code Playgroud)

...... ......

// hint to opengl to not bother with this buffer
const GLenum discards[]  = {GL_DEPTH_ATTACHMENT};
glBindFramebuffer(GL_FRAMEBUFFER, _defaultFramebuffer);
glDiscardFramebufferEXT(GL_FRAMEBUFFER, 1, discards);

// present render
[_context presentRenderbuffer:GL_RENDERBUFFER];
Run Code Online (Sandbox Code Playgroud)

我们实际上并没有使用深度或模板缓冲区.

当我们将纹理渲染为切片时会发生这种情况,并且每次加载新切片时都会发生这种情况.它指向我们的glDrawArrays命令.

关于我们如何摆脱这种警告的任何建议?

如果它有帮助,这就是我们设置图层的方式:

eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys:
                                [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking,
                                kEAGLColorFormatRGB565, kEAGLDrawablePropertyColorFormat,
                                nil];
Run Code Online (Sandbox Code Playgroud)

opengl-es framebuffer ios opengl-es-2.0

13
推荐指数
1
解决办法
2332
查看次数

重复绑定到cocos2d 2.0中的山峰的OpenGL-es纹理

来源文章

我正在尝试实现raywenderlich的教程,使用cocos2d生成具有重复条带坐标的山丘,本文是为Cocos2D 1.0编写的,当我试图将其移植到Cocos2D 2.0时这意味着更新它为openGl-es 2.到目前为止,一切都运行得很好但是我遇到的问题是让山的纹理重复正常...

这是我的代码:

向山丘发送纹理:

CCSprite *stripes = [self stripedSpriteWithColor1:color3 color2:color4 textureSize:512 stripes:nStripes];
    stripes.position = ccp(winSize.width/2,winSize.height/2);
    ccTexParams tp2 = {GL_LINEAR, GL_LINEAR, GL_REPEAT, GL_CLAMP_TO_EDGE};
    [stripes.texture setTexParameters:&tp2];
    _terrain.stripes = stripes;
    _backgroundTerrain.stripes = stripes;
Run Code Online (Sandbox Code Playgroud)

生成纹理:

-(CCSprite *)stripedSpriteWithColor1:(ccColor4F)c1 color2:(ccColor4F)c2 textureSize:(float)textureSize stripes:(int) nStripes {
    // 1: Create new CCRenderTexture
    CCRenderTexture *rt = [CCRenderTexture renderTextureWithWidth:textureSize height:textureSize];

    // 2: Call CCRenderTexture:begin

    [rt beginWithClear:c1.r g:c1.g b:c1.b a:c1.a];

    // 3: Draw into texture
    //OpenGL gradient

    NSLog(@"Strip color is: %f : %f : %f", c2.r,c2.g,c2.b);

    CGPoint …
Run Code Online (Sandbox Code Playgroud)

opengl-es objective-c cocos2d-iphone opengl-es-2.0

13
推荐指数
1
解决办法
3040
查看次数

适用于Linux的BlueStacks模拟器?

我在linux下,我需要一个运行Android并支持OpenGL ES的虚拟机,我知道BlueStacks在Windows和Mac下运行良好,我想知道Linux是否有类似的解决方案.

谢谢.

PS

我在Ubuntu 13.04 64位下

android opengl-es virtual-machine

13
推荐指数
1
解决办法
5万
查看次数

如何在OpenGL ES 2.0 Android中绘制基本圆

我是OpenGL ES 2的新手,我已经阅读了许多关于如何在Android上的OpenGL ES 2中绘制圆圈的主题.基于Drawing Shapesgamedev.net上的代码,我可以绘制三角形和quares,但我仍然不知道如何绘制圆.我现在有三种绘制圆圈的方法:

  1. 生成圆形顶点并使用glDrawArray(GL_LINES,...).根据您生成的顶点数量,这将产生一个漂亮而清晰的结果.
  2. 使用预生成的圆形纹理(具有Alpha透明度)并将其映射到四边形.这将产生非常平滑的图形并允许"快速"圆圈,但它不会那么灵活:即使使用mipmapping,您也希望纹理与渲染四边形的大小相同.
  3. 使用片段着色器.

但是我该如何实现它们呢?

android opengl-es opengl-es-2.0

13
推荐指数
4
解决办法
3万
查看次数

如何使用Delphi XE5在Android上访问OpenGL渲染上下文?

在使用Delphi XE5开发应用程序时,如何在Android设备上创建OpenGL渲染上下文?

基本上我不知道从哪里开始.还没有OpenGL示例.

我期望存在的东西:

  • 某种事件(Panel.OnRender)将提供我可以调用OpenGL调用的现有上下文.

  • 可以放在表单设计器中的通用TOpenGLSurface控件

  • 一种在运行时在主窗体上创建上下文的方法.

从我迄今为止的研究中我可以TWindowManager.Render访问OpenGL调用并使用它们来渲染弹出窗口.

编辑:向表单添加一个计时器并调用此过程用绿色填充屏幕,这意味着GL上下文已经存在:

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  glClearColor(0, 1, 0, 0);
  glClear(GL_DEPTH_BUFFER_BIT or GL_STENCIL_BUFFER_BIT or GL_COLOR_BUFFER_BIT);
  eglSwapBuffers(TCustomAndroidContext.SharedDisplay, TCustomAndroidContext.SharedSurface);
end;
Run Code Online (Sandbox Code Playgroud)

问题是 - 如何正确处理它,在受控环境中对Timer进行渲染绝对是一个坏主意.

delphi android opengl-es delphi-xe5

13
推荐指数
1
解决办法
1973
查看次数

在同一着色器中混合具有不同坐标和大小的两个纹理

我的片段着色器中有两个不同坐标 大小的纹理:

varying highp vec2 v_currentTextureCoords;
varying highp vec2 v_backgroundTextureCoords;
uniform sampler2D u_currentTexture;
uniform sampler2D u_backgroundTexture;

void main()
{
    vec4 currentColor = texture2D(u_currentTexture, v_currentTextureCoords);
    vec4 backgroundColor = texture2D(u_backgroundTexture, v_backgroundTextureCoords);

    gl_FragColor = backgroundColor;
}
Run Code Online (Sandbox Code Playgroud)

这是相应的顶点着色器:

attribute vec4 a_position;
attribute vec2 a_currentTextureCoords;
attribute vec2 a_backgroundTextureCoords;
varying vec2 v_currentTextureCoords;
varying vec2 v_backgroundTextureCoords;

void main()
{
    gl_Position = a_position;
    v_currentTextureCoords = a_currentTextureCoords;
    v_backgroundTextureCoords = a_backgroundTextureCoords;
}
Run Code Online (Sandbox Code Playgroud)

那些着色器负责渲染u_currentTexture.

编辑:用我的真实应用程序(Android应用程序)更新帖子和问题.

如上所述,这两个纹理是:

  • u_backgroundTexture:这是一个视频流,全屏,大小为1080x1920
  • u_currentTexture:它可以是任何图像,尺寸为469x833(较小相同比例).

为了简化,现在, …

android opengl-es glsl vertex-shader fragment-shader

13
推荐指数
1
解决办法
848
查看次数