void GLC_MeshData::setVboUsage(bool usage) { if (usage && (m_PositionSize != -1) && (!m_Positions.isEmpty()) && (!m_VertexBuffer.isCreated())) { createVBOs(); fillVbo(GLC_MeshData::GLC_Vertex); fillVbo(GLC_MeshData::GLC_Normal); fillVbo(GLC_MeshData::GLC_Texel); fillVbo(GLC_MeshData::GLC_Color); useVBO(false, GLC_MeshData::GLC_Color); const int lodCount= m_LodList.count(); for (int i= 0; i < lodCount; ++i) { m_LodList.at(i)->setIboUsage(usage); } } else if (!usage && m_VertexBuffer.isCreated()) { m_Positions= positionVector(); m_PositionSize= m_Positions.size(); m_VertexBuffer.destroy(); m_Normals= normalVector(); m_NormalBuffer.destroy(); if (m_TexelBuffer.isCreated()) { m_Texels= texelVector(); m_TexelsSize= m_Texels.size(); m_TexelBuffer.destroy(); } if (m_ColorBuffer.isCreated()) { m_Colors= colorVector(); m_ColorSize= m_Colors.size(); m_ColorBuffer.destroy(); } const int lodCount= m_LodList.count(); for (int i= 0; i < lodCount; ++i) { m_LodList.at(i)->setIboUsage(usage); } } m_UseVbo= usage; }
QVector3D WhittedRenderer::trace(const Ray& primaryRay, int depth, const QList<Shape*>& shapes, const QList<Light*>& lights) { double minDist = std::numeric_limits<double>::max(); Shape* closestShape = nullptr; QVector3D shaded; if (m_grid->intersect(primaryRay, closestShape, minDist)) { auto material = closestShape->material(); shaded = material->ambientReflectivity() * m_ambientLightColor * material->colorVector(); QColor color = material ? material->color() : QColor(40, 40, 40); QVector3D diffuseColor(color.redF(), color.greenF(), color.blueF()); QVector4D hitPoint = primaryRay.along(minDist); QVector4D normalVector = closestShape->surfaceNormal(hitPoint, primaryRay); QVector4D viewVector = -primaryRay.direction(); foreach(Light* light, lights) { QVector3D emittance; QVector4D lightVector; light->sample(lightVector, emittance); lightVector = lightVector - hitPoint; float lightVectorLengthSquared = lightVector.lengthSquared(); float lightVectorLength = sqrt(lightVectorLengthSquared); lightVector.normalize(); Ray shadowRay(hitPoint, lightVector); double t; Shape* blockingShape; bool shadowRayHit = m_grid->intersect(shadowRay, blockingShape, t); if (!shadowRayHit || (shadowRayHit && (lightVectorLengthSquared < t * t))) { // Diffuse float dot = fmax(0.0f, QVector4D::dotProduct(lightVector, normalVector)) * material->diffuseReflectivity(); emittance *= 1 / (1 + 0.2 * lightVectorLength + 0.08 * lightVectorLengthSquared); shaded += dot * QVector3D(emittance.x() * diffuseColor.x(), emittance.y() * diffuseColor.y(), emittance.z() * diffuseColor.z()); // Specular if (material->specularReflectivity() > 0.0) { QVector4D reflectedLightVector = MathUtils::reflect(-lightVector, normalVector); // lightVector and normalVector are already normalized float dot = QVector4D::dotProduct(reflectedLightVector, viewVector); if (dot > 0.0) shaded += material->specularReflectivity() * pow(dot, material->shininess()) * emittance; } } }
/** * @brief Renders the trackball representation. * @todo setTrackballOrthographicMatrix should be set during viewport resize */ void render (void) { if(drawTrackball) { float ratio = (viewport[2] - viewport[0]) / (viewport[3] - viewport[1]); setTrackballOrthographicMatrix(-ratio, ratio, -1.0, 1.0, 0.1, 100.0); trackball_shader.bind(); //Using unique viewMatrix for the trackball, considering only the rotation to be visualized. Eigen::Affine3f trackballViewMatrix = Eigen::Affine3f::Identity(); trackballViewMatrix.translate(defaultTranslation); trackballViewMatrix.rotate(quaternion); trackball_shader.setUniform("viewMatrix", trackballViewMatrix); trackball_shader.setUniform("projectionMatrix", trackballProjectionMatrix); trackball_shader.setUniform("nearPlane", near_plane); trackball_shader.setUniform("farPlane", far_plane); bindBuffers(); //X: Eigen::Vector4f colorVector(1.0, 0.0, 0.0, 1.0); trackball_shader.setUniform("modelMatrix", Eigen::Affine3f::Identity()*Eigen::AngleAxis<float>(M_PI/2.0,Eigen::Vector3f(0.0,1.0,0.0))); trackball_shader.setUniform("in_Color", colorVector); glDrawArrays(GL_LINE_LOOP, 0, 200); //Y: colorVector << 0.0, 1.0, 0.0, 1.0; trackball_shader.setUniform("modelMatrix", Eigen::Affine3f::Identity()*Eigen::AngleAxis<float>(M_PI/2.0,Eigen::Vector3f(1.0,0.0,0.0))); trackball_shader.setUniform("in_Color", colorVector); glDrawArrays(GL_LINE_LOOP, 0, 200); //Z: colorVector << 0.0, 0.0, 1.0, 1.0; trackball_shader.setUniform("modelMatrix", Eigen::Affine3f::Identity()); trackball_shader.setUniform("in_Color", colorVector); glDrawArrays(GL_LINE_LOOP, 0, 200); unbindBuffers(); trackball_shader.unbind(); } }
void GLC_MeshData::copyVboToClientSide() { if (m_VertexBuffer.isCreated() && m_Positions.isEmpty()) { Q_ASSERT(m_NormalBuffer.isCreated()); m_Positions= positionVector(); m_Normals= normalVector(); if (m_TexelBuffer.isCreated()) { m_Texels= texelVector(); } if (m_ColorBuffer.isCreated()) { m_Colors= colorVector(); } } }