„SzgGrafVizsga20120613” változatai közötti eltérés

Gabesz852 (vitalap | szerkesztései)
Gabesz852 (vitalap | szerkesztései)
20. sor: 20. sor:
(15 pont)
(15 pont)


Egy megoldás, amely közel jó eredményt ad:
Egy megoldás, amely közel jó eredményt ad:<br/>


Csúcspont árnyaló:
Csúcspont árnyaló:<br/>
 
void vertex(in float4 position : POSITION,
            out float4 oPosition : POSITION,
      out float4 posTexcoord : TEXCOORD0)
{
if (position.x == 0.0)                      //x irányú nyújtás
position.x = -1.0;
 
if (position.y == 0.0)                      //y irányú nyújtás
position.y = -1.0;
oPosition = position;                      //végső pozíció kiadása (erre rajzol majd)
posTexcoord = oPosition;                    //pozíció a fragmens shadernak
}
 
Képpont árnyaló:
 
void fragment(in float4 position : TEXCOORD0,
      out float4 oColor : COLOR)
{
float P = position.x * position.x + position.y * position.y;      //x<sup>2</sup> + y<sup>2</sup>
float innerR = 0.7 * 0.7;                                          //r<sup>2</sup>
float outerR = 0.9 * 0.9;                                          //R<sup>2</sup>
if (P >= innerR && P <= outerR)              //a pontnak az r sugarú körön kívül és az R sugarú körön belül kell lennie
oColor = float4(1, 1, 1, 1);
else
oColor = float4(0, 0, 0, 1);
}
 
Mivel a fragmens shader alapból nem kapja meg a pozíciókat, csak a textúrakoordinátákat, ezért trükközni kell egy kicsit. A vertex shaderből a módosított pozícióvektort visszaadom, mint egy textúrakoordinátát, így már elérhető a fragmens shaderből is. Azért kell mindenképpen átadni, mert a vertex shader csak a csúcspontokat kezeli, tehát az csak a négy koordinátát kapja meg, és nyilván a négy sarok nincs benne a gyűrűben, tehát ha ott végeznénk a számításokat, akkor az egész kép fekete lenne. A fragmens shader viszont az összes képpontot kezeli, így ott elvégezhető a számolás.
Ezzel a két programmal, a megadott vertexekkel a következő képet kaptam:
 
[[:File:grafika_vertex_shader_korgyuru.png]]


void vertex(in float4 position : POSITION,<br/>
            out float4 oPosition : POSITION,<br/>
      out float4 posTexcoord : TEXCOORD0)<br/>
{<br/>
if (position.x == 0.0)                      //x irányú nyújtás<br/>
position.x = -1.0;<br/>
<br/>
if (position.y == 0.0)                      //y irányú nyújtás<br/>
position.y = -1.0;<br/>
<br/>
oPosition = position;                      //végső pozíció kiadása (erre rajzol majd)<br/>
posTexcoord = oPosition;                    //pozíció a fragmens shadernak<br/>
}<br/>
<br/>
Képpont árnyaló:<br/>
<br/>
void fragment(in float4 position : TEXCOORD0,<br/>
      out float4 oColor : COLOR)<br/>
{<br/>
float P = position.x * position.x + position.y * position.y;      //x<sup>2</sup> + y<sup>2</sup><br/>
float innerR = 0.7 * 0.7;                                          //r<sup>2</sup><br/>
float outerR = 0.9 * 0.9;                                          //R<sup>2</sup><br/>
<br/>
if (P >= innerR && P <= outerR)              //a pontnak az r sugarú körön kívül és az R sugarú körön belül kell lennie<br/>
oColor = float4(1, 1, 1, 1);<br/>
else<br/>
oColor = float4(0, 0, 0, 1);<br/>
}<br/>
<br/>
Mivel a fragmens shader alapból nem kapja meg a pozíciókat, csak a textúrakoordinátákat, ezért trükközni kell egy kicsit. A vertex shaderből a módosított pozícióvektort visszaadom, mint egy textúrakoordinátát, így már elérhető a fragmens shaderből is. Azért kell mindenképpen átadni, mert a vertex shader csak a csúcspontokat kezeli, tehát az csak a négy koordinátát kapja meg, és nyilván a négy sarok nincs benne a gyűrűben, tehát ha ott végeznénk a számításokat, akkor az egész kép fekete lenne. A fragmens shader viszont az összes képpontot kezeli, így ott elvégezhető a számolás.<br/>
Ezzel a két programmal, a megadott vertexekkel a következő képet kaptam:<br/>
<br/>
[[:File:grafika_vertex_shader_korgyuru.png]]<br/>
<br/>
A hiba okát nem tudom, elvileg minden klappol. Javítás jöhet.
A hiba okát nem tudom, elvileg minden klappol. Javítás jöhet.
--[[Szerkesztő:Gabesz852|Gabesz852]] ([[Szerkesztővita:Gabesz852|vita]]) 2014. január 22., 15:12 (UTC)
--[[Szerkesztő:Gabesz852|Gabesz852]] ([[Szerkesztővita:Gabesz852|vita]]) 2014. január 22., 15:12 (UTC)
A lap eredeti címe: „https://vik.wiki/SzgGrafVizsga20120613