// パーティクルの発生処理 public void EmitParticle(Vector3 _position) { // 使用できるパーティクル数を取得 ComputeBuffer.CopyCount(m_particlePoolBuffer, m_particlePoolCountsBuffer, 0); m_particlePoolCountsBuffer.GetData(m_particleCounts); m_particlePoolNum = m_particleCounts[0]; // エミット数未満ならエミット処理をしない if (m_particleCounts[0] < m_numEmitParticles) { return; } // 変数を設定 _computeShader.SetFloat(ShaderDefines.GetFloatPropertyID(ShaderDefines.FloatID._elapsedTime), Time.time); _computeShader.SetVector(ShaderDefines.GetVectorPropertyID(ShaderDefines.VectorID._position), _position); _computeShader.SetVector(ShaderDefines.GetVectorPropertyID(ShaderDefines.VectorID._range), _range); _computeShader.SetVector(ShaderDefines.GetVectorPropertyID(ShaderDefines.VectorID._minVelocity), _minVelocity); _computeShader.SetVector(ShaderDefines.GetVectorPropertyID(ShaderDefines.VectorID._maxVelocity), _maxVelocity); _computeShader.SetFloat(ShaderDefines.GetFloatPropertyID(ShaderDefines.FloatID._startScale), _startScale); _computeShader.SetFloat(ShaderDefines.GetFloatPropertyID(ShaderDefines.FloatID._endScale), _endScale); _computeShader.SetVector(ShaderDefines.GetVectorPropertyID(ShaderDefines.VectorID._color), _color); _computeShader.SetFloat(ShaderDefines.GetFloatPropertyID(ShaderDefines.FloatID._lifeTime), _lifeTime); // バッファを設定 _computeShader.SetBuffer(m_emitKernel, ShaderDefines.GetBufferPropertyID(ShaderDefines.BufferID._particlePoolBuffer), m_particlePoolBuffer); _computeShader.SetBuffer(m_emitKernel, ShaderDefines.GetBufferPropertyID(ShaderDefines.BufferID._particlesBuffer), m_particlesBuffer); // エミットカーネルを実行 _computeShader.Dispatch(m_emitKernel, m_numEmitParticles / THREAD_NUM_X, 1, 1); }
// public関数 #region public method public void PutFootsteps(Vector3 _position) { // バッファを設定 _computeShader.SetBuffer(m_putKernel, ShaderDefines.GetBufferPropertyID(ShaderDefines.BufferID._verticesBuffer), m_verticesBuffer); // 変数を設定 _computeShader.SetVector(ShaderDefines.GetVectorPropertyID(ShaderDefines.VectorID._playerPosition), new Vector2(_position.x, _position.z)); // カーネルの実行 _computeShader.Dispatch(m_putKernel, m_numThreadGroups * m_numThreadGroups, 1, 1); }
// 頂点の計算 void CalculateVertex() { // バッファを設定 _computeShader.SetBuffer(m_calculateKernel, ShaderDefines.GetBufferPropertyID(ShaderDefines.BufferID._verticesBuffer), m_verticesBuffer); // 変数を設定 _computeShader.SetFloat(ShaderDefines.GetFloatPropertyID(ShaderDefines.FloatID._fieldSize), FIELD_SIZE); _computeShader.SetInt(ShaderDefines.GetIntPropertyID(ShaderDefines.IntID._numVertices), _numVertices); _computeShader.SetFloat(ShaderDefines.GetFloatPropertyID(ShaderDefines.FloatID._distance), m_distance); _computeShader.SetFloat(ShaderDefines.GetFloatPropertyID(ShaderDefines.FloatID._height), _height); _computeShader.SetFloat(ShaderDefines.GetFloatPropertyID(ShaderDefines.FloatID._smoothness), _smoothness * _numVertices); _computeShader.SetVector(ShaderDefines.GetVectorPropertyID(ShaderDefines.VectorID._offset), new Vector2(_offsetX, _offsetY)); // カーネルの実行 _computeShader.Dispatch(m_calculateKernel, m_numThreadGroups, 1, m_numThreadGroups); }
// 更新処理 public void Update(ComputeShader _computeShader, Camera _camera, int _numParticles, ComputeBuffer _particlesBuffer, ComputeBuffer _activeParticlesBuffer) { // 視錘台カリングを行うカーネル int kernel = _computeShader.FindKernel("FrustumCulling"); // 視錘台の計算 CalculateFrustumPlanes(_camera.projectionMatrix * _camera.worldToCameraMatrix, ref m_planes); // 視錘台の法線を分解 for (int i = 0; i < 4; i++) { Debug.DrawRay(_camera.transform.position, m_planes[i].normal * 10f, Color.yellow); m_normalsFloat[i + 0] = m_planes[i].normal.x; m_normalsFloat[i + 4] = m_planes[i].normal.y; m_normalsFloat[i + 8] = m_planes[i].normal.z; } // バッファのカウンターをリセット m_inViewParticlesBuffer.SetCounterValue(0); // カメラの座標 Vector3 cameraPosition = _camera.transform.position; // 変数を設定 _computeShader.SetInt(ShaderDefines.GetIntPropertyID(ShaderDefines.IntID._numParticles), _numParticles); _computeShader.SetFloats(ShaderDefines.GetVectorPropertyID(ShaderDefines.VectorID._cameraPosition), cameraPosition.x, cameraPosition.y, cameraPosition.z); _computeShader.SetFloats(ShaderDefines.GetVectorPropertyID(ShaderDefines.VectorID._cameraFrustumNormals), m_normalsFloat); // バッファを設定 _computeShader.SetBuffer(kernel, ShaderDefines.GetBufferPropertyID(ShaderDefines.BufferID._particlesBuffer), _particlesBuffer); _computeShader.SetBuffer(kernel, ShaderDefines.GetBufferPropertyID(ShaderDefines.BufferID._activeParticlesBuffer), _activeParticlesBuffer); _computeShader.SetBuffer(kernel, ShaderDefines.GetBufferPropertyID(ShaderDefines.BufferID._inViewParticlesBuffer), m_inViewParticlesBuffer); // カーネルを実行 _computeShader.Dispatch(kernel, Mathf.CeilToInt((float)_activeParticlesBuffer.count / NUM_THREAD_X), 1, 1); // バッファにデータを渡す m_inViewCountsBuffer.SetData(m_inViewCounts); // 視界内のパーティクル数を取得 ComputeBuffer.CopyCount(m_inViewParticlesBuffer, m_inViewCountsBuffer, 4); }