标签: glkit

创建更平滑的边缘或以其他方式修复 SCNView 中框上的锯齿状边缘?

下面的代码在SCNView. 但是,边缘沿着面向您的侧面/元件的顶部和底部呈锯齿状(如附件所示)。目标是渲染类似于 Minecraft 盒子的更平滑的边缘。更改相机位置会减少某些边缘的像素化,那么这是相机角度问题吗?如果是,是否可以渲染具有平滑边缘的盒子,无论相机角度如何?

例如,设置相机位置以SCNVector3(x: 0.0, y: 0.0, z: 10.0)有效地以 2D 形式渲染盒子并具有清晰的边缘(第二个附件)。

在此输入图像描述 在此输入图像描述

    let sceneView = SCNView(frame: self.view.frame)
    self.view.addSubview(sceneView)

    let scene = SCNScene()
    sceneView.scene = scene

    let camera = SCNCamera()
    let cameraNode = SCNNode()
    cameraNode.camera = camera
    cameraNode.position = SCNVector3(x: -3.0, y: 0.0, z: 10.0)

    let ambientLight = SCNLight()
    ambientLight.type = SCNLightTypeAmbient
    ambientLight.color = UIColor(red: 0.2, green: 0.2, blue: 0.2, alpha: 1.0)
    cameraNode.light = ambientLight

    let light = SCNLight()
    light.type = SCNLightTypeOmni
    let lightNode = SCNNode()
    lightNode.light …
Run Code Online (Sandbox Code Playgroud)

3d ios glkit scenekit swift

4
推荐指数
1
解决办法
1653
查看次数

GLKit与金属透视矩阵的区别

我正在raywenderlich.com上阅读Metal 教程,其中引入了一个纯Swift Swift4x4 帮助器类。99%的内容只是GLKit函数的包装,只有一个确实令我困惑的函数:

  static func makePerspectiveViewAngle(_ fovyRadians: Float, aspectRatio: Float, nearZ: Float, farZ: Float) -> float4x4 {
    var q = unsafeBitCast(GLKMatrix4MakePerspective(fovyRadians, aspectRatio, nearZ, farZ), to: float4x4.self)
    let zs = farZ / (nearZ - farZ)
    q[2][2] = zs
    q[3][2] = zs * nearZ
    return q
  }
Run Code Online (Sandbox Code Playgroud)

为什么需要改变q[2][2]和改变q[3][2]。这是Metal和GLKit的坐标系之间的某种不兼容吗?

这是本教程的特殊选择吗?如果不是,GLKit和金属数学之间是否还有其他不兼容之处?


更新:我从WWDC 2016会议上发现了有关Metal的剪辑空间坐标系的很好的插图:采用Metal I.

剪辑空间

opengl 3d glkit swift metal

4
推荐指数
1
解决办法
953
查看次数

在OpenGL中制作一张带有文本的"纸条"(特别是在iOS 5上)

我从来没有做过OpenGL,但我正在寻找关于我正在练习的AR应用程序上这个特定问题的一些指示.

我想创建一个带有"扁平矩形"的应用程序以及写在矩形表面上的文本.在视觉上,我想象着一张纸上写着文字的东西.每次应用程序启动时,文本都会有所不同(文本是从plist文件中提取的).

用户可以从各个方向查看纸张,就像在他面前挂着一张纸一样.

在OpenGL中这是微不足道的吗?我该怎么开始?

对于真正开放式的问题感到抱歉,但我想知道这种事情是如何完成的.

看一下Xcode示例项目中的OpenGL模板源代码,我看到有一个很大的顶点数组.我认为要创建一个"平面"矩形,我只需要删除或使z轴为零.然后动态文本将附加到扁平矩形的表面......我不知道该怎么做......

opengl-es ios glkit

3
推荐指数
1
解决办法
733
查看次数

适当使用GLKBaseEffect

嗨!

我一直在研究更新一些旧的测试代码,试图了解添加到GLKit的新功能.到目前为止,我已经设法建立一个GLKViewController并开始渲染一些基本的形状,但很难找到关于GLKBaseEffect的任何体面的信息.

GLKBaseEffect文档说明:

在初始化时,您的应用程序首先创建一个OpenGL ES 2.0上下文并使其成为当前.然后,它分配并初始化一个新的效果对象,配置其属性,并调用其prepareToDraw方法.绑定效果会导致着色器被编译并绑定到当前的OpenGL ES上下文.基本效果还需要应用程序提供顶点数据.要提供顶点数据,请创建一个或多个顶点数组对象.对于着色器所需的每个属性,顶点数组对象应启用该属性并指向存储在顶点缓冲区对象中的数据.

我正在努力辨别的是;

我是否需要为每个"模型"呈现GLKBaseEffect对象?或者我是否为每个"场景"使用单个GLKBaseEffect,只需在调用prepareToDraw之前动态更改属性?

我已经看过一些游戏引擎和渲染器的教程,它们只为每个模型使用一个GLKBaseEffect,但如果使用单个实例可以实现同样的效果,这似乎完全没有效率.

从阅读文档看,这似乎是最好的方法,但考虑到我看到很多人使用多个实例,我开始认为情况并非如此.

任何人都可以对此有所了解吗?对于iOS(以及我)来说,GLKit仍然相当新,所以任何信息都会非常感激.

ios5 glkit

3
推荐指数
1
解决办法
3312
查看次数

GLKBaseEffect prepareToDraw GL ERROR:0x0501

所以我一直在用一些OpenglES做一些iphone开发,但是当我在我的效果上调用prepareToDraw时,我得到一个相当奇怪的错误.简而言之,我的程序模拟骰子滚动(试图学习objective-c和opengl).该程序在大多数情况下工作正常,我可以使用我编写的应用程序所做的一切(有物理上的错误,但以后会修复).在使用包含OpenGL的部件之后,问题出现了.

该程序包含2个菜单,你必须经过这个菜单才能到达使用OpenGL的屏幕,一旦你使用了应用程序OpenGL部分并返回到上一个菜单,然后再次尝试回到OpenGL部分,我得到一个打印出GL ERROR:0x0501.我把它缩小到由我的效果中的prepareToDraw方法引起的.关于它的另一个奇怪的部分是,如果我回去,然后再向前,OpenGL再次工作,并且可以一次又一次地重复,以使其工作并且每隔一次你进入OpenGL部分就会破坏.

我一直在寻找与我类似的问题,但每次它都与加载不是两种力量纹理的纹理有关,这对我没有帮助,因为我甚至还没有使用纹理,只是彩色顶点.

我已经粘贴了我的两个代码文件,问题应该在哪里

Dice.m:http://pastebin.com/ze1DEEzs 在draw方法中你会看到我的打印输出缩小了问题所在,这就是prepareToDraw方法.(第308行)

RollViewController.m:http://pastebin.com/VycwAh3R 这个文件是我设置效果和上下文等的地方,所以我必须在这里做错了导致prepareToDraw方法每次第二次运行OpenGL时搞乱该计划的一部分.我有一种感觉它与不放弃某种资源与上下文和效果有关,但我无法找到任何关于删除上下文和效果(可能因为你不需要但我不确定).

我希望有人遇到同样的问题,可以回答我的问题,我希望它不仅仅是一个愚蠢的错误,因为我一直试图解决这个问题:)

谢谢

opengl-es objective-c ios glkit

3
推荐指数
1
解决办法
1757
查看次数

如何使用GLKMathUnproject

我使用GLKit创建了一个简单的3D世界.我正在尝试根据屏幕点击在我的3D世界中找到一个特定的点.看来我想要使用GLKMathUnproject.该方法的签名是:

GLKVector3 GLKMathUnproject (
   GLKVector3 window,
   GLKMatrix4 model,
   GLKMatrix4 projection,
   int *viewport,
   bool *success
);
Run Code Online (Sandbox Code Playgroud)

有些事情让我对它需要的参数感到困惑.首先不应该窗口坐标是GLKVector2?最重要的是,不会将屏幕上的点投射到3D空间中而是创建光线而不是单个点.当您将3D空间中的点投影到2D平面(也称为屏幕)上时,您会丢失关于该点的一维信息.那么如何才能将2D屏幕点转换为3D世界点,而无需指定您希望"取消投射"您的观点的深度?在互联网上的任何地方都没有关于这种方法的评论(除了苹果文档).

linear-algebra ios glkit

3
推荐指数
1
解决办法
1732
查看次数

当图像太大时,OpenGL的黑色纹理

在我的应用程序(Tres)中,我正在从图像选取器加载图像并将其放在纹理上.这一切在我的所有测试中都运行良好,但是现在,那些带有视网膜显示器的iPad的在线人员抱怨图像变黑了.

我正在查看GL_MAX_TEXTURE_SIZE以确保图像不大于该值.

在这里我设置纹理:

texture_aspect = image.size.width / image.size.height;
CGFloat side = image.size.width;

if(side>GL_MAX_TEXTURE_SIZE)
    side = GL_MAX_TEXTURE_SIZE;
UIImage *newImage = [ImageUtils imageWithImage:image scaledToSize:CGSizeMake(side, side)];

image_height = 600.0f;
image_width = image_height * texture_aspect;
if(image_width>600.0f) {
    image_width = 900.0f;
    image_height = image_width / texture_aspect;
}

NSError* error;
GLKTextureInfo * texture = [GLKTextureLoader textureWithCGImage:newImage.CGImage options:nil error:&error];
if (error) {
    NSLog(@"Error loading texture from image: %@",error);
}
Run Code Online (Sandbox Code Playgroud)

这就是我绘制图像的方式:

- (void) dibujaFoto {
    self.effect.texture2d0.enabled = GL_TRUE;
    [self.effect prepareToDraw];
    glEnableVertexAttribArray(GLKVertexAttribPosition);
    glEnableVertexAttribArray(GLKVertexAttribTexCoord0);

    GLfloat squareVertices[] = { …
Run Code Online (Sandbox Code Playgroud)

opengl-es objective-c ios opengl-es-2.0 glkit

3
推荐指数
1
解决办法
1784
查看次数

GLKit深度测试不起作用

我正在使用Ray Wenderlich的教程使用GLKit制作一个简单的OpenGlES 2应用程序,并且我遇到了一些问题.

我通过将顶点和索引数据添加到现有顶点和索引数据结构来更改示例代码以显示两个立方体.它工作,并在屏幕上绘制两个立方体.

问题是当新的立方体落后于旧立方体时,它会显示出来.但是,当旧立方体位于新立方体后面时,它不会显示出来.

也许我的深度测试搞砸了?

由于我的声誉,我无法发布图片:(这里是源代码的链接:https: //www.dropbox.com/s/4xrq3gmnmbcz02m/EthanGillCubeSnap.zip

任何帮助深表感谢!

opengl-es objective-c ios glkit

3
推荐指数
1
解决办法
523
查看次数

在IB的GLKViewController中的Xcode 5中,顶部/底部布局指南是什么?

在IB的GLKViewController中的Xcode 5中,顶部/底部布局指南是什么?我一直在阅读文档,似乎无法在任何地方找到它.

layout interface-builder ios glkit

3
推荐指数
1
解决办法
877
查看次数

扩展名为 .Shader、.vsh、.fsh 的着色器有什么区别?

场景套件中名为“name.Shader”和“name.vsh”和“name.fsh”的文件有什么区别?当我在项目中调用一些着色器时,我的模型就像一个紫色蒙版。我应该怎么办?

ios glkit scenekit

3
推荐指数
1
解决办法
5014
查看次数