Opengl es 使用纹理坐标在纹理上绘制SceneKit

Opengl es 使用纹理坐标在纹理上绘制SceneKit,opengl-es,ios8,glsl,shader,scenekit,Opengl Es,Ios8,Glsl,Shader,Scenekit,我有一个Collada模型,我把它加载到SceneKit中。当我在模型上执行命中测试时,我能够检索被命中模型的纹理坐标 有了这些纹理坐标,我应该能够用颜色替换纹理坐标。 这样我就可以在模型上画画了 如果到目前为止我错了,请纠正我 到目前为止,我读了很多文章,但我只是没有正确理解我的着色器。 (虽然我确实得到了一些古怪的效果;-) 我的顶点着色器: precision highp float; attribute vec4 position; attribute vec2 textureCoor

我有一个Collada模型,我把它加载到SceneKit中。当我在模型上执行命中测试时,我能够检索被命中模型的纹理坐标

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

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

到目前为止,我读了很多文章,但我只是没有正确理解我的着色器。 (虽然我确实得到了一些古怪的效果;-)

我的顶点着色器:

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);
}

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

首先,着色器不是绘制对象材质的唯一方法。另一个可能适合您的选项是使用SpriteKit场景作为材质的内容-请参阅以获取相关帮助

如果坚持使用着色器路径,则不需要重写整个着色器程序,只需在现有纹理上绘制即可。(如果你这样做了,你就会失去SceneKit程序为你提供的东西,比如照明和凹凸贴图。除非你真的想,否则再发明这些轮子是没有意义的。)取而代之的是,使用着色器修饰符-一个插入SceneKit着色器程序的GLSL片段。说明了如何使用这些

第三,我不确定您是否以最佳方式为着色器提供纹理坐标。您希望每个片段为单击的点获得相同的texcoord值,因此将其作为属性传递到GL并在顶点和片段阶段之间插值没有什么意义。只需将其作为制服传递,并使用键值编码在材质上设置制服。(有关使用KVC绑定着色器参数的信息,请参见。)

最后,为了抓住你问题的要点……:)

要在特定纹理坐标集处或附近更改片段着色器(或着色器修改器)的输出颜色,只需将传入的单击坐标与用于常规纹理查找的当前纹理坐标集进行比较。下面是一个这样做的示例,使用着色器修改器路径:

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
}
uniformvec2点击texcoord;
//使用setValue:forKey:
//和一个包含CGPoint数据的NSValue
均匀浮动半径=0.01;
//更改此选项以确定要高亮显示的区域的大小
均匀vec3颜料颜色=vec4(0.0,1.0,0.0);
//美丽而绿色;你也可以用KVC来改变这一点
#布拉格体
if(距离(_surface.diffuseTextCoord.x,clickTexcoord.x)<半径){
_surface.diffuse.rgb=颜料颜色
}

将此示例用作
SCNShaderModifierEntryPointSurface
着色器修改器,照明/着色仍将应用于结果。如果希望绘制覆盖照明,请改用
SCNShaderModifierEntryPointFragment
着色器修改器,并在GLSL片段集
\u output.color.rgb
中改用
\u surface.color.rgb

哇。。。这是迄今为止最好的信息。。。谢谢我会处理这些信息,让你知道什么最有效。。非常感谢。事情变得更清楚了。。。。。我添加了一个shaderModifier,稍微修改了上面的代码,但总体上是一样的。。。。。多谢各位much@rickster你的答案很清楚,我想这会帮助我解决自己的问题。它还没有成功,所以我在上贴了一个问题,希望像你这样的人能帮上忙。顺便说一句,你提供的第一个链接“这个答案”实际上是指向同一个“SCNShadable参考”的链接;这是故意的吗。另外,你在上一张便条中提到了“surface.color”,我想你指的是“surface.diffuse”。@rickster你能解释一下如何设置
clickTexcoord
?我正在努力将vec4传递给着色器修改器: