gpt4 book ai didi

ios - SCNShadable - 从纹理中改变变量和样本

转载 作者:可可西里 更新时间:2023-11-01 01:32:58 26 4
gpt4 key购买 nike

我正在尝试通过 SCNShadable 使用着色器,但我找不到任何关于如何使事情正常工作的好文档。这是我想要完成的:

func setup() {
// attach a video to a SpriteKit node that renders to my SceneKit node
// (might not be key to this question)
let player = videoPlayer
let item = player.currentItem!
let track = item.asset.tracks(withMediaType: AVMediaTypeVideo).first
let size = track.naturalSize
let node = SKVideoNode(avPlayer: player)
node.position = CGPoint(x: size.width / 2, y: size.height / 2)
node.size = size
let scene = SKScene(size: size)
scene.addChild(node)
videoGeometry.firstMaterial?.diffuse.contents = scene

let customProjection = getCustomProjection()

// use custom shaders to render
let vertexShader = "" +
"attribute mediump vec2 aVertexPosition; \n" +
"uniform mediump mat4 customProjection; \n" +
"varying mediump vec3 vDirection; \n" +

"void main(void) { \n" +
"gl_Position = vec4(aVertexPosition, 1.0, 1.0); \n" +
"mediump vec4 projective_direction = customProjection * gl_Position; \n" +
"vDirection = projective_direction.xyz / projective_direction.w; \n" +
"} \n" +

let fragmentShader = "" +
"varying mediump vec3 vDirection; \n" +
"uniform mediump float someUniformParam; \n" +
"uniform sampler2D uSampler; \n" +

"mediump vec4 directionToColor(mediump vec3 direction, mediump float someUniformParam) { \n" +
"... \n" +
"} \n" +

"void main(void) { \n" +
"gl_FragColor = directionToColor(vDirection, someUniformParam); \n" +
"} \n" +


videoGeometry.firstMaterial?.shaderModifiers = [
"fragmentShader": fragmentShader,
"vertexShader": vertexShader,
]
}

func beforeRender() {
// somehow pass uniforms values to the shaders
attachUniforms(customProjection, someUniformParam)
}

我不知道如何:

  • SCNShadable 中拆分那些着色器逻辑 protocol .听起来 SCNShaderModifierEntryPointGeometry 在顶点着色器中运行,而其他 3 个入口点在片段着色器中运行。看来我必须将 SCNShaderModifierEntryPointFragment 用于我的片段逻辑。
  • 引用内置制服,例如顶点位置(我命名为aVertexPosition)和纹理(uSampler)
  • 确保我的 varying 变量从顶点传递到片段着色器
  • 在绘制场景之前将制服参数传递给片段和顶点着色器。

最佳答案

使用 SCNShadable,您可以编写包含在较大着色器文件中的着色器代码片段。我写了一篇关于我如何使用它的中篇文章:https://medium.com/@guillaumesabran/working-with-scnshadable-783b4bca20d3#.tcv7r11mj

所以这意味着我必须忘记控制整个着色器代码,而是对我的代码片段将要运行的环境有一些了解。

这些文件中可用的变量在 Apple 网站上的记录很少,但是一旦您掌握了着色器代码(请参阅顶点和片段),事情就会变得容易一些。

例如,漫反射纹理被命名为 u_diffuseTexture 所以在 SCNShaderModifierEntryPointFragment 中我可以这样做:

texture2D(u_diffuseTexture, vec2(0.5, 0.5));

将可变变量从顶点传递到片段着色器工作正常。

关于制服,只要你知道怎么做,事情就没问题了:

// in some SCNShaderModifierEntryPointFragment code
#pragma arguments
uniform int someUniformVariable;

#pragma body
...

然后我可以设置制服的值:

videoGeometry.firstMaterial?.setValue(1, forKey: "someUniformVariable")

关于ios - SCNShadable - 从纹理中改变变量和样本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38936251/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com