如何解决(Sceneform)如何使用 .mat 文件使用纹理
我来自非英语国家,所以我不熟悉英语。感谢您的理解。
我正在根据此链接渲染虚线。但是,即使过了两天,它仍然没有得到解决。 How I can set repeated texture on an object in Android ArCore Sceneform API?
如您所见,对象是完全黑色的。 我想,这段代码似乎根本没有加载任何纹理!我的理解一定有误。
如果我的问题没有违反社区规则,请帮助我。
我的基础假模型是 .gltf 文件。使用 Blender v2.8 我如何附加纹理该自定义材料文件?这是我的代码。
-line.gltf
{
"asset" : {
"generator" : "Khronos glTF Blender I/O v1.5.17","version" : "2.0"
},"scene" : 0,"scenes" : [
{
"name" : "Scene","nodes" : [
0
]
}
],"nodes" : [
{
"mesh" : 0,"name" : "Plane","rotation" : [
0.7071068286895752,0.7071067094802856
]
}
],"materials" : [
{
"doubleSided" : true,"name" : "None","pbrMetallicRoughness" : {
"baseColorFactor" : [
0.800000011920929,0.800000011920929,1
],"metallicFactor" : 0,"roughnessFactor" : 0.5
}
}
],"meshes" : [
{
"name" : "Plane","primitives" : [
{
"attributes" : {
"POSITION" : 0,"NORMAL" : 1,"TEXCOORD_0" : 2
},"indices" : 3,"material" : 0
}
]
}
],"accessors" : [
{
"bufferView" : 0,"componentType" : 5126,"count" : 4,"max" : [
0.5,0.5
],"min" : [
-0.5,-0.5
],"type" : "VEC3"
},{
"bufferView" : 1,{
"bufferView" : 2,"type" : "VEC2"
},{
"bufferView" : 3,"componentType" : 5123,"count" : 6,"type" : "SCALAR"
}
],"bufferViews" : [
{
"buffer" : 0,"byteLength" : 48,"byteOffset" : 0
},{
"buffer" : 0,"byteOffset" : 48
},"byteLength" : 32,"byteOffset" : 96
},"byteLength" : 12,"byteOffset" : 128
}
],"buffers" : [
{
"byteLength" : 140,"uri" : "line.bin"
}
]
}
我的 bin 文件是独立的。
-
repeating_texture.mat
材料{ "name": "重复纹理",参数 : [ { 类型:sampler2d, 名称:纹理 },
{ type: "float",name:"repeat_x" },{ type: "float",name: "repeat_y" } ],requires : [ "position","uv0" ],
} 片段{ 无效材料(输入材料输入材料){ 准备材料(材料);
vec2 uv = getUV0(); uv.x = uv.x * materialParams.repeat_x; uv.y = uv.y * materialParams.repeat_y; material.baseColor = texture(materialParams_texture,uv).rgba; }
}
这是模型渲染方法。 我从主活动 onCreate() 调用此方法。
ModelRenderable.builder()
.setSource(context,com.mary.myapplication.R.raw.material_holder)
.build()
.thenAccept(Consumer { modelRenderable: ModelRenderable ->
repeatingMaterial = modelRenderable.material
DlogUtil.d(TAG,"해치웠나? ㅇㅇ")
EventCenter.instance.sendEvent(ESSArrow.LOAD_MODELIING_FINISH,this,null)
}).exceptionally {
DlogUtil.d(TAG,"해치웠나? ㄴㄴ")
return@exceptionally null
}
这是渲染方法。
fun drawDashCylinderLine(
context: Context,lineColor: Color,radius: Float,length: Float,parentNode: TransformableNode,from: Vector3,to: Vector3
) {
val lengthCM: Float = length * 100
repeatingMaterial?.setFloat("repeat_x",lengthCM / 10)
repeatingMaterial?.setFloat("repeat_y",lengthCM / 10)
MaterialFactory.makeOpaqueWithColor(context,lineColor)
.thenAccept { material: Material? ->
// 2. make a model by the material
val model = ShapeFactory.makeCylinder(
radius,length,Vector3(0f,0f,0f),repeatingMaterial
)
// 3. make node
val node = Node()
node.renderable = model
node.setParent(parentNode)
node.worldPosition = Vector3.add(to,from).scaled(.5f);
//4. set rotation
val difference = Vector3.subtract(to,from)
val directionFromTopToBottom = difference.normalized()
val rotationFromAToB =
Quaternion.lookRotation(
directionFromTopToBottom,Vector3.up()
)
node.worldRotation = Quaternion.multiply(
rotationFromAToB,Quaternion.axisAngle(Vector3(1.0f,0.0f,0.0f),90f)
)
}
}
这是我的纹理文件位置....enter image description here
解决方法
这听起来像是临时修复,但我找到了解决方案!
当从 onCreate() 调用 modelRenderable 时,纹理也被调用并指定为全局变量。
Texture.builder().setSource { context.assets.open("textures/line_texture.png") }
.setSampler(sampler)
.build()
.thenAccept {
texture = it
}
但是,不幸的是,没有应用材料的透明度。如果有人知道怎么应用,给我一个答案(哭)
我需要控制不透明度.......
,如果我仔细阅读文档,这太容易了。 这是 .mat 文件中的配置问题。
添加此材料参考
blending : transparent
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。