我无法尝试使用纹理贴图在iOS模拟器上运行一个简单的四边形.我已经阅读了这里涉及类似事情的所有其他问题而且我被困住了.输出如下所示:
纹理是这样的:
我的代码是这样的:
// v1 +----+ v0 // | | // v2 +----+ v3 SCNVector3 vertices[] = { SCNVector3Make( 5.0, 5.0, 0.0), SCNVector3Make( -5.0, 5.0, 0.0), SCNVector3Make( -5.0, -5.0, 0.0), SCNVector3Make( 5.0, -5.0, 0.0) }; SCNVector3 normals[] = { SCNVector3Make( 0.0f, 0.0f, 1.0), SCNVector3Make( 0.0f, 0.0f, 1.0), SCNVector3Make( 0.0f, 0.0f, 1.0), SCNVector3Make( 0.0f, 0.0f, 1.0) }; CGPoint textureCoordinates[] = { CGPointMake( 1.0, 1.0), CGPointMake( 0.0, 1.0), CGPointMake( 0.0, 0.0), CGPointMake( 1.0, 0.0) }; NSUInteger vertexCount = 4; NSMutableData *indicesData = [NSMutableData data]; UInt8 indices[] = { 0, 1, 2, 0, 2, 3}; [indicesData appendBytes:indices length:sizeof(UInt8)*6]; SCNGeometryElement *indicesElement = [SCNGeometryElement geometryElementWithData:indicesData primitiveType:SCNGeometryPrimitiveTypeTriangles primitiveCount:2 bytesPerIndex:sizeof(UInt8)]; NSMutableData *vertexData = [NSMutableData dataWithBytes:vertices length:vertexCount * sizeof(SCNVector3)]; SCNGeometrySource *verticesSource = [SCNGeometrySource geometrySourceWithData:vertexData semantic:SCNGeometrySourceSemanticVertex vectorCount:vertexCount floatComponents:YES componentsPerVector:3 bytesPerComponent:sizeof(float) dataOffset:0 dataStride:sizeof(SCNVector3)]; NSMutableData *normalData = [NSMutableData dataWithBytes:normals length:vertexCount * sizeof(SCNVector3)]; SCNGeometrySource *normalsSource = [SCNGeometrySource geometrySourceWithData:normalData semantic:SCNGeometrySourceSemanticNormal vectorCount:vertexCount floatComponents:YES componentsPerVector:3 bytesPerComponent:sizeof(float) dataOffset:0 dataStride:sizeof(SCNVector3)]; NSMutableData *textureData = [NSMutableData dataWithBytes:textureCoordinates length:vertexCount * sizeof(CGPoint)]; SCNGeometrySource *textureSource = [SCNGeometrySource geometrySourceWithData:textureData semantic:SCNGeometrySourceSemanticTexcoord vectorCount:vertexCount floatComponents:YES componentsPerVector:2 bytesPerComponent:sizeof(float) dataOffset:0 dataStride:sizeof(CGPoint)]; SCNGeometry *geometry = [SCNGeometry geometryWithSources:@[verticesSource, normalsSource, textureSource] elements:@[indicesElement]]; SCNMaterial *material = [SCNMaterial material]; //material.diffuse.contents = [UIColor redColor]; material.diffuse.contents = [UIImage imageNamed:@"diffuse.jpg"]; material.diffuse.wrapS = SCNWrapModeRepeat; material.diffuse.wrapT = SCNWrapModeRepeat; material.diffuse.contentsTransform = SCNMatrix4MakeScale( 1.0f, 1.0f, 1.0f); material.doubleSided = YES; material.normal.wrapS = SCNWrapModeRepeat; material.normal.wrapT = SCNWrapModeRepeat; // material.litPerPixel = YES; geometry.materials = @[material];
[编辑]我用这段代码尝试了很多不同的东西,似乎没什么用.我还没有在Objective-C中看到适用于iOS的工作示例.对material.diffuse.wrapS的任何更改都无效.
我之前在OpenGL中做过这种事情没有任何问题,但我已经盯着这段代码好几天了,看不出我的错误.任何帮助将非常感激.
@ Paul-Jan让我走上了正确的轨道,这引出了我的答案:
将我的纹理坐标从CGPoint更改为浮动可以修复它.
float textureCoordinates[] = { 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0 }; NSMutableData *textureData = [NSMutableData dataWithBytes:textureCoordinates length:vertexCount * sizeof(float) * 2]; SCNGeometrySource *textureSource = [SCNGeometrySource geometrySourceWithData:textureData semantic:SCNGeometrySourceSemanticTexcoord vectorCount:vertexCount floatComponents:YES componentsPerVector:2 bytesPerComponent:sizeof(float) dataOffset:0 dataStride:sizeof(float) * 2];
结果: