gpt4 book ai didi

opengl-es - SceneKit 使用纹理坐标绘制纹理

转载 作者:行者123 更新时间:2023-12-02 08:31:39 26 4
gpt4 key购买 nike

我有一个加载到 SceneKit 中的 Collada 模型。当我对模型执行 hittest 时,我能够检索被击中的模型的纹理坐标。

有了这些纹理坐标,我应该能够用颜色替换纹理坐标。所以这样我应该可以在模型上绘图

到目前为止,如果我错了,请纠正我。

到目前为止,我阅读了很多文章,但我就是没有正确使用着色器。(虽然我确实得到了一些时髦的效果;-)

我的顶点着色器:

precision highp float;

attribute vec4 position;
attribute vec2 textureCoordinate;
attribute vec2 aTexureCoordForColor; //coordinates from the hittest

uniform mat4 modelViewProjection;

varying vec2 aTexureCoordForColorVarying; // passing to the fragment shader here
varying vec2 texCoord;

void main(void) {
// Pass along to the fragment shader
texCoord = textureCoordinate;
aTexureCoordForColorVarying = aTexureCoordForColor; //assigning here
// output the projected position
gl_Position = modelViewProjection * position;
}

我的片段着色器

precision highp float;

uniform sampler2D yourTexture;

uniform vec2 uResolution;
uniform int uTexureCoordsCount;

varying vec2 texCoord;
varying vec2 aTexureCoordForColorVarying;

void main(void) {

// ??????????? no idea anymore what to do here
gl_FragColor = texture2D(yourTexture, texCoord);
}

如果您需要更多代码,请告诉我。

最佳答案

首先,着色器并不是在对象 Material 上绘制的唯一方法。另一种可能适合您的选择是使用 SpriteKit 场景作为 Material 的内容 — 请参阅 this answer寻求一些帮助。

如果您坚持使用着色器路线,则无需重写整个着色器程序,只需在现有纹理上进行绘制即可。 (如果你这样做,你会失去 SceneKit 程序为你提供的东西,比如光照和凹凸贴图。除非你真的想要,否则重新发明这些轮子是没有意义的。)相反,使用着色器修改器 - 插入到着色器中的一小段 GLSL SceneKit 着色器程序。 SCNShadable reference解释如何使用它们。

第三,我不确定您是否以最佳方式向着色器提供纹理坐标。您希望每个片段都为单击点获得相同的 texcoord 值,因此将其作为属性传递到 GL 并在顶点和片段阶段之间进行插值毫无意义。只需将它作为制服传递,然后使用键值编码在您的 Material 上设置该制服。 (有关使用 KVC 绑定(bind)着色器参数的信息,请参阅 SCNShadable reference again。)

最后,进入问题的重点...:)

要在一组特定的纹理坐标处或附近更改片段着色器(或着色器修改器)的输出颜色,只需将您传入的点击坐标与用于常规纹理的当前一组纹理坐标进行比较抬头。这是一个这样做的例子,走着色器修改器路线:

uniform vec2 clickTexcoord;
// set this from ObjC/Swift code with setValue:forKey:
// and an NSValue with CGPoint data

uniform float radius = 0.01;
// change this to determine how large an area to highlight

uniform vec3 paintColor = vec4(0.0, 1.0, 0.0);
// nice and green; you can change this with KVC, too

#pragma body

if (distance(_surface.diffuseTexcoord.x, clickTexcoord.x) < radius) {
_surface.diffuse.rgb = paintColor
}

将此示例用作 SCNShaderModifierEntryPointSurface 着色器修改器,光照/着色仍将应用于结果。如果您希望绘画覆盖光照,请改用 SCNShaderModifierEntryPointFragment 着色器修改器,并在 GLSL 片段中设置 _output.color.rgb 而不是 _surface.color。 RGB.

关于opengl-es - SceneKit 使用纹理坐标绘制纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26129111/

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