<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=474095&amp;view=findpost&amp;p=3938845</guid>
        <pubDate>Thu, 09 Apr 2026 00:00:41 +0000</pubDate>
        <title>как можно сделать лучи света</title>
        <link>https://forum.sources.ru/index.php?showtopic=474095&amp;view=findpost&amp;p=3938845</link>
        <description><![CDATA[leon2009: столько времени прошло  :no-sad: <br>
Может кому пригодится: это не совсем то что я хотел , лучи есть, но они не от источника света <br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure TForm1.VolumeRays;</div><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;NumOuterRays = 72; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Количество внешних цилиндров (лучей)</div><div class="code_line">&nbsp;&nbsp;OuterCylinderHeight = 80; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Высота внешнего конуса</div><div class="code_line">&nbsp;&nbsp;OuterCylinderBottomRadius = 0.1; &nbsp; &nbsp; &nbsp; &nbsp;// Толщина (радиус) каждого внешнего цилиндра</div><div class="code_line">&nbsp;&nbsp;OuterTotalRadius = 20; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Радиус основания внешнего конуса</div><div class="code_line">&nbsp;&nbsp;NumMiddleRays = 62; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Количество средних цилиндров</div><div class="code_line">&nbsp;&nbsp;MiddleCylinderHeight = 80; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Высота среднего конуса</div><div class="code_line">&nbsp;&nbsp;MiddleCylinderBottomRadius = 0.1; &nbsp; &nbsp; &nbsp; &nbsp;// Толщина (радиус) каждого среднего цилиндра</div><div class="code_line">&nbsp;&nbsp;MiddleTotalRadius = 10; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Радиус основания среднего конуса</div><div class="code_line">&nbsp;&nbsp;NumInnerRays = 52; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Количество внутренних цилиндров</div><div class="code_line">&nbsp;&nbsp;InnerCylinderHeight = 80; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Высота внутреннего конуса</div><div class="code_line">&nbsp;&nbsp;InnerCylinderBottomRadius = &nbsp;0.1; &nbsp; &nbsp; &nbsp; &nbsp; // Толщина (радиус) каждого внутреннего цилиндра</div><div class="code_line">&nbsp;&nbsp;InnerTotalRadius = 5; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Радиус основания внутреннего конуса</div><div class="code_line">&nbsp;&nbsp;NumSmallestRays = 42; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Количество самых малых цилиндров</div><div class="code_line">&nbsp;&nbsp;SmallestCylinderHeight = 80; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Высота самого малого конуса</div><div class="code_line">&nbsp;&nbsp;SmallestCylinderBottomRadius = 0.1; &nbsp; &nbsp; &nbsp;// Толщина (радиус) каждого самого малого цилиндра</div><div class="code_line">&nbsp;&nbsp;SmallestTotalRadius = 3; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Радиус основания самого малого конуса</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;I: Integer;</div><div class="code_line">&nbsp;&nbsp;OuterRay, MiddleRay, InnerRay, SmallestRay: TGLCylinder;</div><div class="code_line">&nbsp;&nbsp;Angle, XPos, ZPos: Single;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;// Создание полупрозрачного материала</div><div class="code_line">&nbsp;&nbsp;GLMaterialLibrary1.Materials.Add;</div><div class="code_line">&nbsp;&nbsp;with GLMaterialLibrary1.Materials[1] do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Material.Texture.Image.LoadFromFile(&#39;add43817.jpg&#39;); &nbsp; // &nbsp;8143817 volum</div><div class="code_line">&nbsp;&nbsp; &nbsp;Material.Texture.Disabled := False;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Name := &#39;VolumeMaterial&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Material.BlendingMode :=bmTransparency; &nbsp;//bmTransparency; &nbsp; &nbsp; &nbsp; &nbsp;bmModulate;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Material.FrontProperties.Ambient.Alpha := 0.1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Material.FrontProperties.Diffuse.Alpha := &nbsp;0.1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Material.FrontProperties.Emission.Alpha := &nbsp;0.1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Material.FrontProperties.Specular.Alpha:= &nbsp; 0.1;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;GLSLShader2.LoadShaderPrograms(&#39;add\sun.Vert&#39;, &#39;add\sun.Frag&#39;);</div><div class="code_line">&nbsp;&nbsp;GLSLShader2.Enabled := true;</div><div class="code_line">&nbsp;&nbsp;GLMaterialLibrary1.LibMaterialByName(&#39;VolumeMaterial&#39;).Shader:=GLSLShader2;</div><div class="code_line">&nbsp;&nbsp;// Осветительный объект</div><div class="code_line">&nbsp;&nbsp;SunLight := TGLLightSource.CreateAsChild(GLScene1.Objects);</div><div class="code_line">&nbsp;&nbsp;SunLight.Position.SetPoint(0, 0, 0);</div><div class="code_line">&nbsp;&nbsp;SunLight.Diffuse.SetColor(1.0, 1.0, 0.0,0.1);</div><div class="code_line">&nbsp;&nbsp;// === Наружный конус (самый большой) ===</div><div class="code_line">&nbsp;&nbsp;for I := 0 to Pred(NumOuterRays) do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Angle := (I * 360 / NumOuterRays) * Pi / 180;</div><div class="code_line">&nbsp;&nbsp; &nbsp;OuterRay := TGLCylinder.CreateAsChild(SunLight);</div><div class="code_line">&nbsp;&nbsp; &nbsp;OuterRay.Height := OuterCylinderHeight;</div><div class="code_line">&nbsp;&nbsp; &nbsp;OuterRay.BottomRadius := OuterCylinderBottomRadius;</div><div class="code_line">&nbsp;&nbsp; &nbsp;OuterRay.TopRadius := OuterCylinderBottomRadius;</div><div class="code_line">&nbsp;&nbsp; &nbsp;XPos := OuterTotalRadius * Sin(Angle);</div><div class="code_line">&nbsp;&nbsp; &nbsp;ZPos := OuterTotalRadius * Cos(Angle);</div><div class="code_line">&nbsp;&nbsp; &nbsp;OuterRay.Position.SetPoint(XPos, -OuterCylinderHeight / 2, ZPos);</div><div class="code_line">&nbsp;&nbsp; &nbsp;OuterRay.Direction.SetVector(-XPos, OuterCylinderHeight, -ZPos);</div><div class="code_line">&nbsp;&nbsp; &nbsp;OuterRay.Direction.Normalize;</div><div class="code_line">&nbsp;&nbsp; &nbsp;OuterRay.Material.MaterialLibrary := GLMaterialLibrary1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;OuterRay.Material.LibMaterialName := &#39;VolumeMaterial&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;OuterRay.PitchAngle := 80;</div><div class="code_line">&nbsp;&nbsp; &nbsp;OuterRay.Parent := GLDummyCube2;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// GLShadowVolume1.Occluders.AddCaster(OuterRay);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;// === Средний конус (среднего размера) ===</div><div class="code_line">&nbsp;&nbsp;for I := 0 to Pred(NumMiddleRays) do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Angle := (I * 360 / NumMiddleRays) * Pi / 180;</div><div class="code_line">&nbsp;&nbsp; &nbsp;MiddleRay := TGLCylinder.CreateAsChild(SunLight);</div><div class="code_line">&nbsp;&nbsp; &nbsp;MiddleRay.Height := MiddleCylinderHeight;</div><div class="code_line">&nbsp;&nbsp; &nbsp;MiddleRay.BottomRadius := MiddleCylinderBottomRadius;</div><div class="code_line">&nbsp;&nbsp; &nbsp;MiddleRay.TopRadius := MiddleCylinderBottomRadius;</div><div class="code_line">&nbsp;&nbsp; &nbsp;XPos := MiddleTotalRadius * Sin(Angle);</div><div class="code_line">&nbsp;&nbsp; &nbsp;ZPos := MiddleTotalRadius * Cos(Angle);</div><div class="code_line">&nbsp;&nbsp; &nbsp;MiddleRay.Position.SetPoint(XPos, -(OuterCylinderHeight / 2) + ((OuterCylinderHeight - MiddleCylinderHeight)/2), ZPos);</div><div class="code_line">&nbsp;&nbsp; &nbsp;MiddleRay.Direction.SetVector(-XPos, MiddleCylinderHeight, -ZPos);</div><div class="code_line">&nbsp;&nbsp; &nbsp;MiddleRay.Direction.Normalize;</div><div class="code_line">&nbsp;&nbsp; &nbsp;MiddleRay.Material.MaterialLibrary := GLMaterialLibrary1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;MiddleRay.Material.LibMaterialName := &#39;VolumeMaterial&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;MiddleRay.PitchAngle := 80;</div><div class="code_line">&nbsp;&nbsp; &nbsp;MiddleRay.Parent := GLDummyCube2;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; // GLShadowVolume1.Occluders.AddCaster(MiddleRay);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; MiddleRay.TurnAngle:=15;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;// === Внутренний конус (ещё меньше) ===</div><div class="code_line">&nbsp;&nbsp;for I := 0 to Pred(NumInnerRays) do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Angle := (I * 360 / NumInnerRays) * Pi / 180;</div><div class="code_line">&nbsp;&nbsp; &nbsp;InnerRay := TGLCylinder.CreateAsChild(SunLight);</div><div class="code_line">&nbsp;&nbsp; &nbsp;InnerRay.Height := InnerCylinderHeight;</div><div class="code_line">&nbsp;&nbsp; &nbsp;InnerRay.BottomRadius := InnerCylinderBottomRadius;</div><div class="code_line">&nbsp;&nbsp; &nbsp;InnerRay.TopRadius := InnerCylinderBottomRadius;</div><div class="code_line">&nbsp;&nbsp; &nbsp;XPos := InnerTotalRadius * Sin(Angle);</div><div class="code_line">&nbsp;&nbsp; &nbsp;ZPos := InnerTotalRadius * Cos(Angle);</div><div class="code_line">&nbsp;&nbsp; &nbsp;InnerRay.Position.SetPoint(XPos, -(OuterCylinderHeight / 2) + ((OuterCylinderHeight - InnerCylinderHeight)/2), ZPos);</div><div class="code_line">&nbsp;&nbsp; &nbsp;InnerRay.Direction.SetVector(-XPos, InnerCylinderHeight, -ZPos);</div><div class="code_line">&nbsp;&nbsp; &nbsp;InnerRay.Direction.Normalize;</div><div class="code_line">&nbsp;&nbsp; &nbsp;InnerRay.Material.MaterialLibrary := GLMaterialLibrary1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;InnerRay.Material.LibMaterialName := &#39;VolumeMaterial&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;InnerRay.PitchAngle := 80;</div><div class="code_line">&nbsp;&nbsp; &nbsp;InnerRay.Parent := GLDummyCube2;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;InnerRay.TurnAngle:=20;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; //GLShadowVolume1.Occluders.AddCaster(InnerRay);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;&nbsp;// === Самый маленький конус (совсем маленький) ===</div><div class="code_line">&nbsp;&nbsp;for I := 0 to Pred(NumSmallestRays) do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Angle := (I * 360 / NumSmallestRays) * Pi / 180;</div><div class="code_line">&nbsp;&nbsp; &nbsp;SmallestRay := TGLCylinder.CreateAsChild(SunLight);</div><div class="code_line">&nbsp;&nbsp; &nbsp;SmallestRay.Height := SmallestCylinderHeight;</div><div class="code_line">&nbsp;&nbsp; &nbsp;SmallestRay.BottomRadius := SmallestCylinderBottomRadius;</div><div class="code_line">&nbsp;&nbsp; &nbsp;SmallestRay.TopRadius := SmallestCylinderBottomRadius;</div><div class="code_line">&nbsp;&nbsp; &nbsp;XPos := SmallestTotalRadius * Sin(Angle);</div><div class="code_line">&nbsp;&nbsp; &nbsp;ZPos := SmallestTotalRadius * Cos(Angle);</div><div class="code_line">&nbsp;&nbsp; &nbsp;SmallestRay.Position.SetPoint(XPos, -(OuterCylinderHeight / 2) + ((OuterCylinderHeight - SmallestCylinderHeight)/2), ZPos);</div><div class="code_line">&nbsp;&nbsp; &nbsp;SmallestRay.Direction.SetVector(-XPos, SmallestCylinderHeight, -ZPos);</div><div class="code_line">&nbsp;&nbsp; &nbsp;SmallestRay.Direction.Normalize;</div><div class="code_line">&nbsp;&nbsp; &nbsp;SmallestRay.Material.MaterialLibrary := GLMaterialLibrary1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;SmallestRay.Material.LibMaterialName := &#39;VolumeMaterial&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;SmallestRay.PitchAngle := 80;</div><div class="code_line">&nbsp;&nbsp; &nbsp;SmallestRay.Parent := GLDummyCube2;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp;SmallestRay.TurnAngle:=30;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// GLShadowVolume1.Occluders.AddCaster(SmallestRay);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;end;</div><div class="code_line">end;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script>]]></description>
        <author>leon2009</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	