From a88557220b618d2245a77d7e1c96ed2f6ef064ea Mon Sep 17 00:00:00 2001 From: brige Date: Fri, 27 Jun 2025 23:53:41 +0800 Subject: [PATCH] modify cone wave --- src/effects/ConeWave.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/effects/ConeWave.cpp b/src/effects/ConeWave.cpp index 6a67c359..4ef1ab1c 100644 --- a/src/effects/ConeWave.cpp +++ b/src/effects/ConeWave.cpp @@ -141,7 +141,14 @@ void ConeWave::SetBaseColor(const osg::Vec4& color) { void ConeWave::SetWaveCount(int count) { waveCount_ = count; - Rebuild(); + + // 如果uniform已经存在,直接更新值 + if (waveCountUniform_.valid()) { + waveCountUniform_->set(static_cast(waveCount_)); + } else { + // 否则重建整个几何体和着色器 + Rebuild(); + } } void ConeWave::SetWaveSpeed(float speed) { @@ -348,13 +355,18 @@ void ConeWave::CreateRadarShader() { "uniform float ringBrightAlpha;\n" "uniform float ringDarkAlpha;\n" "uniform float waveSpeed;\n" + "uniform float waveCount;\n" "varying vec3 pos;\n" "void main()\n" "{\n" " float h = abs(pos.z) / max(height, 1.0);\n" " float radialDist = sqrt(pos.x * pos.x + pos.y * pos.y);\n" - " float wavePhase = radialDist * 3.2 - waveTime * waveSpeed;\n" + " float waveFreq = 0.2 * max(1.0, waveCount * 0.1);\n" + " float timeScale = waveTime * waveSpeed * 0.1;\n" + " float wavePhase = radialDist * waveFreq - timeScale;\n" " float ripple = sin(wavePhase);\n" + " float ripple2 = sin(wavePhase * 1.1 + timeScale * 0.5);\n" + " ripple = (ripple + ripple2 * 0.3) / 1.3;\n" " if (ripple > 0.3)\n" " {\n" " gl_FragColor = vec4(waveColor.rgb, ringBrightAlpha);\n" @@ -383,6 +395,7 @@ void ConeWave::CreateRadarShader() { waveColorUniform_ = new osg::Uniform("waveColor", waveColor_); levelHeightUniform_ = new osg::Uniform("height", height_ > 0 ? height_ : 100.0f); // 确保高度不为0 waveSpeedUniform_ = new osg::Uniform("waveSpeed", waveSpeed_ > 0 ? waveSpeed_ : 1.0f); + waveCountUniform_ = new osg::Uniform("waveCount", waveCount_ > 0 ? waveCount_ : 1); // 创建透明度控制uniform变量 ringBrightAlphaUniform_ = new osg::Uniform("ringBrightAlpha", ringBrightAlpha_); @@ -393,6 +406,7 @@ void ConeWave::CreateRadarShader() { stateSet->addUniform(waveColorUniform_); stateSet->addUniform(levelHeightUniform_); stateSet->addUniform(waveSpeedUniform_); + stateSet->addUniform(waveCountUniform_); stateSet->addUniform(ringBrightAlphaUniform_); stateSet->addUniform(ringDarkAlphaUniform_); }