2026-03-18 20:09:32 +03:00

61 lines
1.4 KiB
C#

using UnityEngine;
class BarcodeDecoder : MonoBehaviour
{
[SerializeField] int Row;
[SerializeField] int Column;
[SerializeField] ComputeShader Shader;
#if UNITY_2020_1_OR_NEWER
GraphicsBuffer readbackBuffer_;
#else
ComputeBuffer readbackBuffer_;
#endif
int kernelIndex_;
Color[] data_;
private void Awake()
{
int count = Row * Column;
int stride = sizeof(float) * 4;
#if UNITY_2020_1_OR_NEWER
readbackBuffer_ =
new GraphicsBuffer(GraphicsBuffer.Target.Structured, count, stride);
#else
readbackBuffer_ =
new ComputeBuffer(count, stride, ComputeBufferType.Structured);
#endif
data_ = new Color[count];
kernelIndex_ = Shader.FindKernel("Read");
}
private void OnDestroy()
{
readbackBuffer_.Dispose();
}
public int GetValue(Texture texture)
{
return Decode(texture);
}
int Decode(Texture source)
{
Shader.SetTexture(kernelIndex_, "Source", source);
Shader.SetInt("Row", Row);
Shader.SetInt("Column", Column);
Shader.SetBuffer(kernelIndex_, "Result", readbackBuffer_);
Shader.Dispatch(kernelIndex_, Row, Column, 1);
readbackBuffer_.GetData(data_);
int value = 0;
for (int i = 0; i < data_.Length; i++)
{
if (data_[i].grayscale > 0.5)
value += 1 << i;
}
return value;
}
}