Pașii algoritmului
Pentru fiecare rază (pixel):
Mesh* lab2::createCube(const char* name) { vector<VertexFormat> vertices { VertexFormat(glm::vec3(0, 0, 0), glm::vec3(0, 0, 0)), VertexFormat(glm::vec3(0, 0, 1), glm::vec3(0, 0, 1)), VertexFormat(glm::vec3(0, 1, 0), glm::vec3(0, 1, 0)), ... } }
Figura 2
Determinarea punctelor de ieșire ale razelor din volum
frameBuffer->Bind();
glEnable(GL_CULL_FACE); glCullFace(GL_FRONT); RenderMesh(meshes["cube"], shaders["BackFaceShader"], model_matrix); glDisable(GL_CULL_FACE);
Determinarea punctelor de intrare ale razelor în volum
FrameBuffer::BindDefault();
Calculul culorilor razelor (Ray Casting)
glActiveTexture(GL_TEXTURE1); glBindTexture(GL_TEXTURE_3D, volumeTexture); glUniform1i(glGetUniformLocation(shader->program, "VolumeTex"), 1);
glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_1D, tfTexture); glUniform1i(glGetUniformLocation(shader->program, "TransferFunc"), 2);
int textureLoc = shader->GetUniformLocation("ExitPoints"); glUniform1i(textureLoc, 0); frameBuffer->BindTexture(0, GL_TEXTURE0);
ExitPointCoord = gl_Position;
ExitPointCoord
se folosește în fragment shader pentru accesarea texturii create în prima etapă.ExitFragCoord
cu valori cuprinse între 0 și 1: EntryPoint = v_color;
VolumeTex
) și coordonata de textură dată de poziția eșantionuluiTransferFunc
și coordonata de textură dată de valoarea scalară anterior obținutăcolorAcum.rgb += (1.0 - colorAcum.a) * colorSample.rgb; colorAcum.a += (1.0 - colorAcum.a) * colorSample.a;
frag_color
pentru a fi transmisă mai departe către fragment shader (în VertexShader_backface.glsl
)out_color
ca să se afișeze fețele spate ale volumului încadrator (în FragmentShader_backface.glsl
)EntryPoint
și ExitPointCoord
(în VertexShader_raycasting.glsl
)ExitFragCoord
pentru accesarea texturii ExitPoints
(în FragmentShader_raycasting.glsl
)ExitPoint
- punctul de ieșire al razei din volumVolumeTex
și de coordonata de textură voxelCoord
)TransferFunc
și de coordonata de textură dată de valoarea scalară curentă)