标签: glkit

GLKView设置drawable属性

我正在尝试移植Apples GLPaint示例以使用GLKit.使用UIView,可以返回视图的CAEAGLLayer并将drawableProperties设置为包含kEAGLDrawablePropertyRetainedBacking.这具有在呈现渲染缓冲区之后保留可绘制内容的效果,如预期的那样.在绘制调用之后,删除此属性会导致闪烁,部分可绘制内容似乎被绘制到不同的缓冲区.

问题是这正是我现在在GLKView中遇到的问题,但似乎没有办法设置drawable属性.返回CAEAGLLayer并设置属性没有任何效果,我没有看到GLKView的任何相关属性来设置保留的支持.

有没有人遇到这个或有解决方案?

iphone opengl-es-2.0 ios5 glkit

31
推荐指数
3
解决办法
4572
查看次数

自iOS6以来,GLKTexture未正确映射

在我的3D对象上使用纹理时,我在Xcode 4.5和iOS 6 SDK中遇到了一个奇怪的行为.在针对OS X 10.8 SDK构建时,我的mac应用程序中也会出现此问题.

我在iOS上使用OpenGL ES 2.0,在OS X 10.8上使用OpenGL传统配置文件(<3.0).

纹理不再放置在正确的坐标处,我有很多工件.VAO正确上传,看起来很好,没有纹理.使用XCode 4.4.1和iOS 5.1 SDK时一切都很好.

VAO完全相同(使用OpenGL ES帧捕获检查),并且纹理制服绑定正确.


Xcode 4.4 VAO概述

Xcode 4.4

Xcode 4.5 VAO概述

Xcode 4.5

XCode 4.4.1(iOS 5.1 SDK)

iOS模拟器5.1 SDK

XCode 4.5(iOS 6 SDK)

iOS模拟器6.0 SDK


代码/着色器片段

用于上传和处理纹理的相关部分.我不得不将着色器剥离到minium.

顶点着色器

precision highp float;
attribute vec2 a_vTextureCoordinate;
uniform mat4 u_mModelViewMatrix;
uniform mat4 u_mModelViewMatrixInverse;
uniform mat4 u_mProjectionMatrix;
uniform mat4 u_mNormalMatrix;
void main()
{
....

    // Transform output position 
    gl_Position = u_mProjectionMatrix * u_mModelViewMatrix * a_vPosition;
    // Pass through texture coordinate v_texcoord = a_vTextureCoordinate.xy;
    v_vPosition = vec3(u_mModelViewMatrix * …
Run Code Online (Sandbox Code Playgroud)

shader opengl-es ios opengl-es-2.0 glkit

19
推荐指数
1
解决办法
679
查看次数

使用GLKit进行按需OpenGL ES渲染

我正在寻找转换我的OpenGL渲染代码以利用一些功能GLKit(即异步纹理加载和由其提供的自动化GLKView/Controller).但是,似乎这些类的设计主要是为了适应使用动画循环渲染的人,而我正在使用按需渲染.另外,一些渲染是针对纹理而不是GLKView的帧缓冲,所以我是否应该只是将GLKView子类化并添加其他FBO?

这种类型的设置是否有推荐的方法?我希望有类似的东西:

  • 将视图控制器设置preferredFramesPerSecond0,或者只是暂停帧更新?
  • 忽略glkViewControllerUpdateglkView:drawInRect:方法,只需要我需要的东西.
  • 将视图setNeedsDisplay与法线UIView一起使用以显示帧(我是否需要调用,bindDrawable因为我也将渲染到纹理?).

如果这不是新API的设计,那么也许不值得努力?我希望文档比它更彻底.当API稍微"成熟"时,可能会提供更多样本......

谢谢

opengl-es ios glkit

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

GLKit的GLKMatrix"专栏"如何?

前提A.

当在线性存储器中讨论"列主要"矩阵时,一个接一个地指定列,使得存储器中的前4个条目对应于矩阵中的第一列.另一方面,"行主要"矩阵被理解为一个接一个地指定行,使得存储器中的前4个条目指定矩阵的第一行.


A GLKMatrix4看起来像这样:

union _GLKMatrix4
{
    struct
    {
        float m00, m01, m02, m03;
        float m10, m11, m12, m13;
        float m20, m21, m22, m23;
        float m30, m31, m32, m33;
    };
    float m[16];
}
typedef union _GLKMatrix4 GLKMatrix4;
Run Code Online (Sandbox Code Playgroud)

文件将在m人员说:

列主要顺序的矩阵元素的一维数组.

前提B

GLKMatrix4中的"行"是一组4个水平声明的浮点数([m00, m01, m02, m03]将是第一个"行").因此,这些条目可以解释为mRowCol(m12将是第1行第2列的条目).


如果我们根据声明的顺序查看这些GLKMatrix结构成员的布局,我们会看到:

[m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, ...]

前4个条目清楚地表示矩阵的第一,而不是第一列.

结论

m 实际上并不是专业,而且文档是错误的.


现在,我应该注意到我实际上并不相信结论,但这两个前提似乎很合理.实际上,我最不信任前提B,但将"行"定义为垂直并将"列"定义为水平似乎很奇怪.有人可以解释一下吗?

c opengl-es matrix ios glkit

15
推荐指数
2
解决办法
2671
查看次数

OpenGL ES 2.0渲染到纹理

我正在尝试使用OpenGL ES 2.0渲染到纹理,但我似乎无法使其工作.

这就是我的进展方式:

    struct RenderTexture
    {
        GLuint framebuffer;
        GLuint tex;
        GLint old_fbo;


        RenderTexture(GLuint width, GLuint height)
        {
            glGetIntegerv(GL_FRAMEBUFFER_BINDING, &old_fbo);

            glGenFramebuffers(1, &framebuffer);
            glGenTextures(1, &tex);

            glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
            glBindTexture(GL_TEXTURE_2D, tex);
            glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 
                         width, height, 0, GL_RGBA, 
                         GL_UNSIGNED_BYTE, NULL);
            glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, 
                                   tex, 0);

            glClearColor(1, 0, 0, 1);
            glClear(GL_COLOR_BUFFER_BIT);

            GLuint status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
            if (status != GL_FRAMEBUFFER_COMPLETE) {
                cout << status << endl; // this is not called
            }

            glBindFramebuffer(GL_FRAMEBUFFER, old_fbo);
        }

        void begin()
        {
            glGetIntegerv(GL_FRAMEBUFFER_BINDING, &old_fbo);
            glBindFramebuffer(GL_FRAMEBUFFER, framebuffer);
        }

        void end() …
Run Code Online (Sandbox Code Playgroud)

opengl-es ios opengl-es-2.0 glkit

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

具有透明背景的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
查看次数

GLKit的GLKBaseEffect和自定义着色器

我一直在研究这个问题,而且我似乎无法理解它已经足够解决它所以我认为我不妨把它扔出去并且聪明的一堆可能有一些想法.:P

基本上我一直在研究一个iPhone项目,我有幸使用所有最新的框架和目标5.1.所以我一直在使用GLKit和GLKBaseEffect,这对我来说一直很好.我开始使用GLKBaseEffect而不是编写自己的着色器的原因是我不太了解glsl.然而,要求变得更加精确,基本效果似乎不再削减它.

因为我已经使用基本效果进行了所有变换,所以如果我可以保持基本效果不变,但是如果有意义的话,可以在顶部添加glsl-type着色器.

我的旧方法看起来像这样(这是一个循环渲染所有对象,其中一个对象包含变换,网格和其他一些不太重要的东西,如纹理,材料等)

ObjectBase *obj = [ResourceManager.shared getObjectNamed:name inScene:sceneName];
GLKMatrix4 modelview = effect.transform.modelviewMatrix;
effect.transform.modelviewMatrix = GLKMatrix4Multiply(effect.transform.modelviewMatrix, obj.transform);

[effect prepareToDraw];
[obj render];

effect.transform.modelviewMatrix = modelView;
Run Code Online (Sandbox Code Playgroud)

在这里,我们获取一个对象来渲染和变换(即平移,旋转和缩放)对象,然后我们渲染它,渲染本身获取对象的网格,绑定缓冲区并渲染它.

到现在为止还挺好.

然而,我想要做的是,在[obj render];调用期间,我希望对象也可以执行类似glUseProgram(someProgram);添加更专业的着色器代码的操作.

我想有人可能会争辩说我正在尝试为我的顶点着色器使用基本效果,并希望为我的片段着色器使用"普通"着色器.至少那是我认为我想做的事情.

我一直在尝试一些事情.

我试图创建片段着色器并glUseProgram在其上,但它说我在设置和编译时需要一个顶点和一个片段着色器.我也尝试创建一个空的顶点着色器,但结果并不好,我不知道会发生什么,但我猜它会否决基本效果.

最后,我倾向于接受它可能最好丢掉基本效果并且一直编写我自己的着色器.我觉得窗外有很多工作,所以我想知道我能节省多少钱.

我明白我对着色器的理解是给我带来最大问题的部分,所以请耐心等待.

shader ios glkit

12
推荐指数
2
解决办法
4170
查看次数

在OS X 10.8上有一些关于GlKit的好例子吗?

我正在尝试使用GLKitfor 创建一个简单的应用程序OSX 10.8,但找不到任何示例.苹果文档刚刚从复制iOSMac没有真正的例子.我有一个3.2 profile设置的上下文,一个CVDisplayLink绘图,但没有.我正试图从iOS(也用GlKit)制作一些简单的绘图.任何帮助,将不胜感激.谢谢.

macos opengl-3 glkit osx-mountain-lion

12
推荐指数
0
解决办法
864
查看次数

在Swift中使用GLKit中的GLKMath

因此,我正在使用一本名为iOS Games的书,来自Ray Wenderlich的教程,并尝试利用那里发现的一些Objective-C代码,使加速度计控制我游戏中的角色.而不是Objective-C,我想使用Swift.我在尝试创建一个GLKVector3类型的var时遇到了一个问题,它代表了一个3D矢量.当我输入时:

var raw:GLKVector3 = GLKVector3Make(irrelevant stuff)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

使用模块GLKVector3作为类型.

我在我的swift文件顶部有一个导入GLKit:

import GLKit
Run Code Online (Sandbox Code Playgroud)

任何想法如何从我的程序中使用GLKMath文件获取功能?

frameworks ios glkit swift

12
推荐指数
1
解决办法
2874
查看次数

在静止图像上具有动画的运动/运动效果

我正在尝试按照用户指导的方式在静止图像中实现动画,如下所示:

原始图片

原始图像

预期结果

预期结果

为此,我尝试了CIBumpDistortionLinear CIFilter。它是动画,但动画并非完全如此。

let bumpDistortionLinearParams: [String: AnyObject] = [
    kCIInputImageKey: coreImage!,
    "inputCenter" : CIVector(string: coordStr),
    "inputRadius": 300.0 as AnyObject,
    "inputAngle" : 90.0 as AnyObject,
    "inputScale" : 0.1 as AnyObject
]

let bumpDistortionLinear = CIFilter(name: "CIBumpDistortionLinear", parameters: bumpDistortionLinearParams)
Run Code Online (Sandbox Code Playgroud)

core-animation core-image ios glkit swift

12
推荐指数
1
解决办法
684
查看次数