c++ - GLES 和无透视

标签 c++ opengl-es

我正在使用 OpenGL ES 3.0 渲染剪辑坐标中提供的许多三角形。我使用 varying 为每个片段生成内插纹理坐标。但是,由于插值使用顶点的 z 坐标,因此插值在屏幕空间中不是线性的。据我所知,GLES 不支持 noperspective 限定符,它应该可以满足我的要求。

您有解决方法的建议吗?我可以提供不带 z 的剪辑坐标,但我需要 z 进行深度测试。

最佳答案

我相信在你的情况下你可以修复片段着色器中的深度(在 ES3 中支持)。您可以使用它来设置深度,同时从该位置移除 Z 坐标。不过,您需要为 Z 组件提供另一个不同的值。

所以在片段着色器中你会得到类似这样的东西:

...
varying zPositionComponent;
...
    vac4 actualVertexPosition = ...; // whatever you had in gl_Position
    zPositionComponent = actualVertexPosition.z;
    gl_Position = vec4(actualVertexPosition.x, actualVertexPosition.y, 0.0, actualVertexPosition.w);

然后在片段着色器中简单地添加片段深度校正作为 gl_FragDepth = zPositionComponent;

注意:我不确定这是否有效,或者您是否真的支持它。您实际上可能需要检查片段的当前深度并丢弃片段(手动执行深度缓冲区),这会使事情复杂化......让我知道它是如何进行的并留下未回答的问题以查看更好的解决方案。

关于c++ - GLES 和无透视,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41851699/

相关文章:

c++ - 在程序中添加空间计数器

c++ - 为什么 glCheckFramebufferStatus 对于 OpenGL ES 3.1+ 上的 GL_DEPTH_COMPONENT 总是 36054?

ios - 带有 iOS GLES 的 UIImageView

android - 旋转/平移矩阵的适当乘法

c++ - C++函数返回数组的方法

c++ - 它会破坏我在 C++ 中的 for 循环吗?

c++ - 有没有办法在类c++中取消初始化变量

c++ - 使用 g++7 构建的代码因访问未对齐的内存而崩溃

iphone - GLKit 中的纹理映射不仅仅适用于设备

iphone - glFramebufferTexture2D 性能