61 lines
1.4 KiB
C#
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;
|
|
}
|
|
}
|