警告:片段着色器无法读取顶点着色器"v_gradient"的输出

Vai*_*akh 44 ios ios10 xcode8

当我使用xcode 8在ios 10中运行我的应用程序时,我在调试控制台中收到以下消息,并且通过UI获取冻结可以让任何人知道为什么会发生这种情况

 ERROR
 /BuildRoot/Library/Caches/com.apple.xbs/Sources/VectorKit/VectorKit-1228.30.7.17.9/GeoGL/GeoGL/GLCoreContext.cpp
 1763: InfoLog SolidRibbonShader: ERROR
 /BuildRoot/Library/Caches/com.apple.xbs/Sources/VectorKit/VectorKit-1228.30.7.17.9/GeoGL/GeoGL/GLCoreContext.cpp
 1764: WARNING: Output of vertex shader 'v_gradient' not read by
 fragment shader
Run Code Online (Sandbox Code Playgroud)

tym*_*mac 50

回答

在Xcode中可能会收到此警告的情况之一是使用使用着色器的应用程序(例如地图应用程序)MKMapView.您会发现地图视图在具有真实硬件/本机操作系统的真实设备上没有该警告的情况下按预期工作.

在sim中,SolidRibbonShader 片段着色器无法读取v_gradient 顶点着色器的输出,可能是因为它处于测试阶段,或者Xcode版本和SIM版本之间可能存在不兼容性.然而,着色器在真实设备上被识别.

说明

这些着色器属于OpenGL渲染管道.渲染管道是OpenGL渲染对象时所采用的步骤序列.

渲染管道负责应用纹理,将顶点转换为右坐标系以及在屏幕上显示字符等内容.

这个管道有六个阶段.

  1. 每顶点操作
  2. 原始集会
  3. 原始处理
  4. 光栅化
  5. 片段处理
  6. 每片段操作

最后,您的设备屏幕上会显示一个图像.这六个阶段称为OpenGL渲染管道,用于渲染的所有数据都必须通过它.

什么是着色器?

着色器是由您开发的一个小程序,位于GPU中.着色器使用称为OpenGL着色语言(GLSL)的特殊图形语言编写.

着色器取代了OpenGL渲染管道中的两个重要阶段:每顶点处理每片段处理阶段.这两个阶段中的每个阶段都有一个着色器.

最终目标Vertex Shader是提供网格顶点到渲染管道的最终转换.其目标Fragment shader是为每个前往帧缓冲区的像素提供着色和纹理数据.

Vertex shaders将三角形的顶点从局部模型坐标系转换为屏幕位置.Fragment shaders计算屏幕上光栅化的三角形内像素的颜色.

单独的着色器对象加速编译和链接

许多OpenGL ES应用程序使用多个顶点片段着色器,重复使用具有不同顶点着色器的相同片段着色器通常很有用,反之亦然.由于核心OpenGL ES规范要求在单个着色器程序中将顶点片段着色器链接在一起,因此混合和匹配着色器会导致大量程序,从而在初始化应用程序时增加着色器编译和链接总时间.

  • 很好的答案,但我在我的真实设备上有这个问题(iPhone 5C,iOS 10.2,但也出现在早期版本,XCode 8.2).我构建我的应用程序并在iPhone上运行它 - 在控制台中出现错误的问题(使用不同的VectorKit版本). (7认同)
  • 是的,但我们能做些什么呢?等待Apple调试? (3认同)
  • 我的设备上有同样的问题(iPhone 5,iOS 10.3.2和Xcode 8.3.3),但在我的其他设备(iPhone 6,iOS 10.3.2和iPhone 4s,9.3.5)中我没有问题.我猜这是iPhone 5的一个问题. (2认同)