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ă)