Шейдер становится черным при смене сценыC#

Место общения программистов C#
Ответить
Anonymous
 Шейдер становится черным при смене сцены

Сообщение Anonymous »

Я новичок в работе с шейдерами, и у меня есть система генерации ландшафта, созданная на основе руководств Себастьяна Лага по процедурному ландшафту:
https://www.youtube.com/playlist?list=P ... SgZBxB3Моя проблема связана с шейдером ландшафта (Встроенный конвейер рендеринга), если я запускаю игру (В редакторе) на сцене с генерацией ландшафта, все работает нормально, Но если я запущу или переключусь на другую сцену, затем переключитесь обратно на сцену с ландшафтом, шейдер ландшафта отобразится черным. Я везде пытался найти ответ, но ничего не нашел.
Код шейдера:

Код: Выделить всё

Shader "Custom/Terrain" {
Properties {
testTexture("Texture", 2D) = "white"{}
testScale("Scale", Float) = 1

}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200

CGPROGRAM
// Physically based Standard lighting model, and enable shadows on all light types
#pragma surface surf Standard fullforwardshadows

// Use shader model 3.0 target, to get nicer looking lighting
#pragma target 3.0

const static int maxLayerCount = 8;
const static float epsilon = 1E-4;

int layerCount;
float3 baseColours[maxLayerCount];
float baseStartHeights[maxLayerCount];
float baseBlends[maxLayerCount];
float baseColourStrength[maxLayerCount];
float baseTextureScales[maxLayerCount];

float minHeight;
float maxHeight;

sampler2D testTexture;
float testScale;

UNITY_DECLARE_TEX2DARRAY(baseTextures);

struct Input {
float3 worldPos;
float3 worldNormal;
};

float inverseLerp(float a, float b, float value) {
return saturate((value-a)/(b-a));
}

float3 triplanar(float3 worldPos, float scale, float3 blendAxes, int textureIndex) {
float3 scaledWorldPos = worldPos / scale;
float3 xProjection = UNITY_SAMPLE_TEX2DARRAY(baseTextures, float3(scaledWorldPos.y, scaledWorldPos.z, textureIndex)) * blendAxes.x;
float3 yProjection = UNITY_SAMPLE_TEX2DARRAY(baseTextures, float3(scaledWorldPos.x, scaledWorldPos.z, textureIndex)) * blendAxes.y;
float3 zProjection = UNITY_SAMPLE_TEX2DARRAY(baseTextures, float3(scaledWorldPos.x, scaledWorldPos.y, textureIndex)) * blendAxes.z;
return xProjection + yProjection + zProjection;
}

void surf (Input IN, inout SurfaceOutputStandard o) {
float heightPercent = inverseLerp(minHeight,maxHeight, IN.worldPos.y);
float3 blendAxes = abs(IN.worldNormal);
blendAxes /= blendAxes.x + blendAxes.y + blendAxes.z;

for (int i = 0; i < layerCount; i ++) {
float drawStrength = inverseLerp(-baseBlends[i]/2 - epsilon, baseBlends[i]/2, heightPercent - baseStartHeights[i]);

float3 baseColour = baseColours[i] * baseColourStrength[i];
float3 textureColour = triplanar(IN.worldPos, baseTextureScales[i], blendAxes, i) * (1-baseColourStrength[i]);

o.Albedo = o.Albedo * (1-drawStrength) + (baseColour+textureColour) * drawStrength;
}

}

ENDCG
}
FallBack "Diffuse"
}
код, заполняющий параметры шейдера:

Код: Выделить всё

using UnityEngine;
using System.Collections;
using System.Linq;

[CreateAssetMenu()]
public class TextureData : UpdatableData {

const int textureSize = 512;
const TextureFormat textureFormat = TextureFormat.RGB565;

public Layer[] layers;

float savedMinHeight;
float savedMaxHeight;

public void ApplyToMaterial(Material material) {

material.SetInt ("layerCount", layers.Length);
material.SetColorArray ("baseColours", layers.Select(x => x.tint).ToArray());
material.SetFloatArray ("baseStartHeights", layers.Select(x => x.startHeight).ToArray());
material.SetFloatArray ("baseBlends", layers.Select(x => x.blendStrength).ToArray());
material.SetFloatArray ("baseColourStrength", layers.Select(x => x.tintStrength).ToArray());
material.SetFloatArray ("baseTextureScales", layers.Select(x => x.textureScale).ToArray());
Texture2DArray texturesArray = GenerateTextureArray (layers.Select (x =>  x.texture).ToArray ());
material.SetTexture ("baseTextures", texturesArray);

UpdateMeshHeights (material, savedMinHeight, savedMaxHeight);
}

public void UpdateMeshHeights(Material material, float minHeight, float maxHeight) {
savedMinHeight = minHeight;
savedMaxHeight = maxHeight;

material.SetFloat ("minHeight", minHeight);
material.SetFloat ("maxHeight", maxHeight);
}

Texture2DArray GenerateTextureArray(Texture2D[] textures) {
Texture2DArray textureArray = new Texture2DArray (textureSize, textureSize, textures.Length, textureFormat, true);
for (int i = 0; i < textures.Length; i++) {
textureArray.SetPixels (textures [i].GetPixels (), i);
}
textureArray.Apply ();
return textureArray;
}

[System.Serializable]
public class Layer {
public Texture2D texture;
public Color tint;
[Range(0,1)]
public float tintStrength;
[Range(0,1)]
public float startHeight;
[Range(0,1)]
public float blendStrength;
public float textureScale;
}

}
Я ничего не знаю о шейдерах, поэтому просто попробовал изменить пару вещей, потом поменял их обратно после того, как это не сработало.
Я ожидал, что цвет ландшафта будет зависеть от уровня y, но он был весь черный.

Подробнее здесь: https://stackoverflow.com/questions/790 ... ene-change
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»