123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960 |
- 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;
- }
- }
|