生成一张光照贴图的实现代码逻辑

生成一张光照贴图(Lightmap)通常涉及以下几个步骤:

  1. 场景准备:设置场景中的几何体、光源和材质。
  2. 光照计算:计算每个表面点的光照信息。
  3. 纹理生成:将光照信息存储到纹理中。

下面是一个简单的示例,展示如何生成光照贴图。这个示例假设你已经有一个场景,并且使用了一个简单的光照模型(例如,漫反射光照)。

1. 场景准备

假设我们有一个简单的场景,包括一个平面和一个点光源。

struct Vertex {
    glm::vec3 position;
    glm::vec3 normal;
    glm::vec2 texCoord;
};

std::vector<Vertex> vertices = {
    // positions          // normals           // texture coords
    { glm::vec3(-1.0f, -1.0f, 0.0f), glm::vec3(0.0f, 0.0f, 1.0f), glm::vec2(0.0f, 0.0f) },
    { glm::vec3( 1.0f, -1.0f, 0.0f), glm::vec3(0.0f, 0.0f, 1.0f), glm::vec2(1.0f, 0.0f) },
    { glm::vec3( 1.0f,  1.0f, 0.0f), glm::vec3(0.0f, 0.0f, 1.0f), glm::vec2(1.0f, 1.0f) },
    { glm::vec3(-1.0f,  1.0f, 0.0f), glm::vec3(0.0f, 0.0f, 1.0f), glm::vec2(0.0f, 1.0f) }
};

std::vector<unsigned int> indices = {
    0, 1, 2,
    2, 3, 0
};

glm::vec3 lightPos = glm::vec3(0.0f, 0.0f, 1.0f);
glm::vec3 lightColor = glm::vec3(1.0f, 1.0f, 1.0f);

2. 光照计算

我们将计算每个顶点的光照信息,并将其存储在一个纹理中。

unsigned int lightmapWidth = 512;
unsigned int lightmapHeight = 512;
std::vector<glm::vec3> lightmapData(lightmapWidth * lightmapHeight);

for (unsigned int y = 0; y < lightmapHeight; ++y) {
    for (unsigned int x = 0; x < lightmapWidth; ++x) {
        // 计算纹理坐标
        float u = static_cast<float>(x) / static_cast<float>(lightmapWidth);
        float v = static_cast<float>(y) / static_cast<float>(lightmapHeight);

        // 插值计算顶点位置和法线
        glm::vec3 position = glm::mix(
            glm::mix(vertices[0].position, vertices[1].position, u),
            glm::mix(vertices[3].position, vertices[2].position, u),
            v
        );
        glm::vec3 normal = glm::mix(
            glm::mix(vertices[0].normal, vertices[1].normal, u),
            glm::mix(vertices[3].normal, vertices[2].normal, u),
            v
        );

        // 计算光照
        glm::vec3 lightDir = glm::normalize(lightPos - position);
        float diff = glm::max(glm::dot(normal, lightDir), 0.0f);
        glm::vec3 diffuse = diff * lightColor;

        // 存储光照信息
        lightmapData[y * lightmapWidth + x] = diffuse;
    }
}

3. 纹理生成

将光照信息存储到纹理中。

GLuint lightmap;
glGenTextures(1, &lightmap);
glBindTexture(GL_TEXTURE_2D, lightmap);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, lightmapWidth, lightmapHeight, 0, GL_RGB, GL_FLOAT, lightmapData.data());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

总结

以上代码展示了如何生成一个简单的光照贴图。实际应用中,光照计算可能会更加复杂,可能需要考虑阴影、全局光照等因素。此外,光照贴图的分辨率和质量也会影响最终效果。希望这个示例能帮助你理解光照贴图的生成过程。

好的,继续深入探讨光照贴图的生成和应用。

4. 更复杂的光照计算

在实际应用中,光照计算可能会更加复杂。以下是一些常见的光照模型和技术:

  1. Phong光照模型:包括环境光、漫反射光和镜面反射光。
  2. 阴影计算:考虑光源被遮挡的情况。
  3. 全局光照:考虑间接光照,例如光线追踪或辐射度方法。

下面是一个更复杂的光照计算示例,使用Phong光照模型并考虑阴影。

Phong光照模型
glm::vec3 CalculatePhongLighting(const glm::vec3& position, const glm::vec3& normal, const glm::vec3& viewPos, const glm::vec3& lightPos, const glm::vec3& lightColor) {
    // 环境光
    glm::vec3 ambient = 0.1f * lightColor;

    // 漫反射光
    glm::vec3 lightDir = glm::normalize(lightPos - position);
    float diff = glm::max(glm::dot(normal, lightDir), 0.0f);
    glm::vec3 diffuse = diff * lightColor;

    // 镜面反射光
    glm::vec3 viewDir = glm::normalize(viewPos - position);
    glm::vec3 reflectDir = glm::reflect(-lightDir, normal);
    float spec = glm::pow(glm::max(glm::dot(viewDir, reflectDir), 0.0f), 32);
    glm::vec3 specular = spec * lightColor;

    return ambient + diffuse + specular;
}
阴影计算

为了简单起见,这里使用一个基本的阴影计算方法:如果光线从光源到表面点被遮挡,则该点处于阴影中。

bool IsInShadow(const glm::vec3& position, const glm::vec3& lightPos, const std::vector<Vertex>& sceneVertices) {
    glm::vec3 lightDir = glm::normalize(lightPos - position);
    for (const auto& vertex : sceneVertices) {
        if (glm::length(vertex.position - position) < glm::length(lightPos - position)) {
            if (glm::dot(vertex.normal, lightDir) > 0.0f) {
                return true;
            }
        }
    }
    return false;
}
生成光照贴图

结合Phong光照模型和阴影计算,生成光照贴图。

glm::vec3 viewPos = glm::vec3(0.0f, 0.0f, 2.0f); // 视点位置

for (unsigned int y = 0; y < lightmapHeight; ++y) {
    for (unsigned int x = 0; x < lightmapWidth; ++x) {
        // 计算纹理坐标
        float u = static_cast<float>(x) / static_cast<float>(lightmapWidth);
        float v = static_cast<float>(y) / static_cast<float>(lightmapHeight);

        // 插值计算顶点位置和法线
        glm::vec3 position = glm::mix(
            glm::mix(vertices[0].position, vertices[1].position, u),
            glm::mix(vertices[3].position, vertices[2].position, u),
            v
        );
        glm::vec3 normal = glm::mix(
            glm::mix(vertices[0].normal, vertices[1].normal, u),
            glm::mix(vertices[3].normal, vertices[2].normal, u),
            v
        );

        // 计算光照
        glm::vec3 lighting = CalculatePhongLighting(position, normal, viewPos, lightPos, lightColor);

        // 考虑阴影
        if (IsInShadow(position, lightPos, vertices)) {
            lighting *= 0.5f; // 简单地将光照减半
        }

        // 存储光照信息
        lightmapData[y * lightmapWidth + x] = lighting;
    }
}

5. 应用光照贴图

在渲染时,将生成的光照贴图应用到几何体上。

顶点着色器
#version 330 core
layout(location = 0) in vec3 aPos;
layout(location = 1) in vec3 aNormal;
layout(location = 2) in vec2 aTexCoord;

out vec2 TexCoord;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

void main() {
    gl_Position = projection * view * model * vec4(aPos, 1.0);
    TexCoord = aTexCoord;
}
片段着色器
#version 330 core
out vec4 FragColor;

in vec2 TexCoord;

uniform sampler2D lightmap;
uniform sampler2D diffuseMap;

void main() {
    vec3 lightColor = texture(lightmap, TexCoord).rgb;
    vec3 diffuseColor = texture(diffuseMap, TexCoord).rgb;
    FragColor = vec4(lightColor * diffuseColor, 1.0);
}

总结

通过以上步骤,我们生成并应用了一张光照贴图。这个示例展示了如何使用Phong光照模型和简单的阴影计算来生成光照贴图,并在渲染时应用它。实际应用中,你可能需要更复杂的光照模型和阴影计算方法,以获得更真实的效果。希望这个示例能帮助你理解光照贴图的生成和应用过程。

好的,继续深入探讨光照贴图的生成和应用,特别是更复杂的光照模型和优化技术。

6. 更复杂的光照模型和优化技术

在实际应用中,光照计算和光照贴图生成可能会涉及更复杂的技术和优化方法。以下是一些常见的技术:

  1. 全局光照:考虑间接光照,例如光线追踪(Ray Tracing)或辐射度(Radiosity)。
  2. 多通道光照贴图:使用多个光照贴图来表示不同的光照信息,例如漫反射、镜面反射和环境光。
  3. 光照贴图压缩:使用压缩技术减少光照贴图的存储和传输开销。
  4. 动态光照贴图:实时更新光照贴图以适应动态光源和场景变化。
全局光照

全局光照技术考虑了间接光照,即光线在场景中的多次反射。以下是一个简单的辐射度方法示例:

glm::vec3 CalculateIndirectLighting(const glm::vec3& position, const glm::vec3& normal, const std::vector<Vertex>& sceneVertices) {
    glm::vec3 indirectLighting(0.0f);
    for (const auto& vertex : sceneVertices) {
        if (vertex.position != position) {
            glm::vec3 lightDir = glm::normalize(vertex.position - position);
            float diff = glm::max(glm::dot(normal, lightDir), 0.0f);
            indirectLighting += diff * vertex.normal; // 简单地使用法线作为光照颜色
        }
    }
    return indirectLighting / static_cast<float>(sceneVertices.size());
}
多通道光照贴图

使用多个光照贴图来表示不同的光照信息,例如漫反射、镜面反射和环境光。

GLuint diffuseLightmap, specularLightmap, ambientLightmap;
glGenTextures(1, &diffuseLightmap);
glGenTextures(1, &specularLightmap);
glGenTextures(1, &ambientLightmap);

// 生成漫反射光照贴图
glBindTexture(GL_TEXTURE_2D, diffuseLightmap);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, lightmapWidth, lightmapHeight, 0, GL_RGB, GL_FLOAT, diffuseLightmapData.data());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

// 生成镜面反射光照贴图
glBindTexture(GL_TEXTURE_2D, specularLightmap);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, lightmapWidth, lightmapHeight, 0, GL_RGB, GL_FLOAT, specularLightmapData.data());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

// 生成环境光照贴图
glBindTexture(GL_TEXTURE_2D, ambientLightmap);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, lightmapWidth, lightmapHeight, 0, GL_RGB, GL_FLOAT, ambientLightmapData.data());
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
光照贴图压缩

使用压缩技术减少光照贴图的存储和传输开销。例如,使用S3TC(DXT)压缩格式:

glBindTexture(GL_TEXTURE_2D, lightmap);
glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, lightmapWidth, lightmapHeight, 0, compressedSize, compressedData);
动态光照贴图

实时更新光照贴图以适应动态光源和场景变化。可以好的,继续深入探讨动态光照贴图的实现和应用。

动态光照贴图

动态光照贴图允许实时更新光照信息,以适应动态光源和场景变化。这在游戏和实时渲染应用中非常重要。以下是实现动态光照贴图的一些关键步骤:

  1. 帧缓冲对象(FBO):使用帧缓冲对象来渲染光照贴图。
  2. 实时更新:在每一帧中更新光照贴图。
  3. 应用动态光照贴图:在渲染场景时使用更新后的光照贴图。
1. 创建帧缓冲对象(FBO)

首先,我们需要创建一个帧缓冲对象,用于渲染光照贴图。

GLuint fbo;
glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);

GLuint lightmapTexture;
glGenTextures(1, &lightmapTexture);
glBindTexture(GL_TEXTURE_2D, lightmapTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, lightmapWidth, lightmapHeight, 0, GL_RGB, GL_FLOAT, nullptr);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, lightmapTexture, 0);

if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) {
    std::cerr << "Error: Framebuffer is not complete!" << std::endl;
}

glBindFramebuffer(GL_FRAMEBUFFER, 0);
2. 实时更新光照贴图

在每一帧中,我们需要更新光照贴图。以下是一个简单的示例,展示如何在每一帧中更新光照贴图。

void UpdateLightmap() {
    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    glViewport(0, 0, lightmapWidth, lightmapHeight);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // 设置光照贴图的渲染着色器
    glUseProgram(lightmapShaderProgram);

    // 设置光源和其他参数
    glUniform3fv(glGetUniformLocation(lightmapShaderProgram, "lightPos"), 1, glm::value_ptr(lightPos));
    glUniform3fv(glGetUniformLocation(lightmapShaderProgram, "lightColor"), 1, glm::value_ptr(lightColor));

    // 渲染场景到光照贴图
    RenderScene();

    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    glViewport(0, 0, screenWidth, screenHeight);
}
3. 应用动态光照贴图

在渲染场景时,我们需要使用更新后的光照贴图。

void RenderSceneWithLightmap() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // 设置场景渲染着色器
    glUseProgram(sceneShaderProgram);

    // 绑定光照贴图
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, lightmapTexture);
    glUniform1i(glGetUniformLocation(sceneShaderProgram, "lightmap"), 0);

    // 渲染场景
    RenderScene();
}
4. 渲染循环

在渲染循环中,我们需要在每一帧中更新光照贴图并渲染场景。

while (!glfwWindowShouldClose(window)) {
    // 更新光照贴图
    UpdateLightmap();

    // 渲染场景
    RenderSceneWithLightmap();

    // 交换缓冲区
    glfwSwapBuffers(window);
    glfwPollEvents();
}

总结

通过以上步骤,我们实现了动态光照贴图的生成和应用。动态光照贴图允许实时更新光照信息,以适应动态光源和场景变化。这在游戏和实时渲染应用中非常重要。希望这个示例能帮助你理解动态光照贴图的实现和应用过程。

进一步优化

在实际应用中,可能需要进一步优化光照贴图的生成和应用。例如:

  1. 分块更新:只更新光照贴图的一部分,以减少计算量。
  2. 多分辨率光照贴图:使用不同分辨率的光照贴图,以平衡性能和质量。
  3. 并行计算:使用多线程或GPU加速光照计算。

这些优化技术可以帮助提高光照贴图的生成效率和渲染性能。希望这些信息对你有所帮助!

好的,继续深入探讨光照贴图的优化技术和高级应用。

7. 光照贴图的进一步优化

在实际应用中,光照贴图的生成和应用可能需要进一步优化,以提高性能和质量。以下是一些常见的优化技术:

1. 分块更新

分块更新技术只更新光照贴图的一部分,以减少计算量。这在动态场景中非常有用,因为通常只有一部分场景会发生变化。

void UpdateLightmapRegion(int x, int y, int width, int height) {
    glBindFramebuffer(GL_FRAMEBUFFER, fbo);
    glViewport(x, y, width, height);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // 设置光照贴图的渲染着色器
    glUseProgram(lightmapShaderProgram);

    // 设置光源和其他参数
    glUniform3fv(glGetUniformLocation(lightmapShaderProgram, "lightPos"), 1, glm::value_ptr(lightPos));
    glUniform3fv(glGetUniformLocation(lightmapShaderProgram, "lightColor"), 1, glm::value_ptr(lightColor));

    // 渲染场景到光照贴图
    RenderScene();

    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    glViewport(0, 0, screenWidth, screenHeight);
}

在渲染循环中,只更新需要更新的区域:

while (!glfwWindowShouldClose(window)) {
    // 更新光照贴图的特定区域
    UpdateLightmapRegion(updateX, updateY, updateWidth, updateHeight);

    // 渲染场景
    RenderSceneWithLightmap();

    // 交换缓冲区
    glfwSwapBuffers(window);
    glfwPollEvents();
}
2. 多分辨率光照贴图

使用不同分辨率的光照贴图,以平衡性能和质量。高分辨率光照贴图用于近景,低分辨率光照贴图用于远景。

GLuint highResLightmap, lowResLightmap;
glGenTextures(1, &highResLightmap);
glGenTextures(1, &lowResLightmap);

// 生成高分辨率光照贴图
glBindTexture(GL_TEXTURE_2D, highResLightmap);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, highResWidth, highResHeight, 0, GL_RGB, GL_FLOAT, nullptr);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

// 生成低分辨率光照贴图
glBindTexture(GL_TEXTURE_2D, lowResLightmap);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, lowResWidth, lowResHeight, 0, GL_RGB, GL_FLOAT, nullptr);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

在渲染时,根据视距选择合适的光照贴图:

void RenderSceneWithMultiResLightmap() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    // 设置场景渲染着色器
    glUseProgram(sceneShaderProgram);

    // 选择合适的光照贴图
    if (isNearView) {
        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, highResLightmap);
    } else {
        glActiveTexture(GL_TEXTURE0);
        glBindTexture(GL_TEXTURE_2D, lowResLightmap);
    }
    glUniform1i(glGetUniformLocation(sceneShaderProgram, "lightmap"), 0);

    // 渲染场景
    RenderScene();
}
3. 并行计算

使用多线程或GPU加速光照计算,以提高光照贴图的生成效率。

使用多线程
void CalculateLightingThread(int start, int end, std::vector<glm::vec3>& lightmapData) {
    for (int i = start; i < end; ++i) {
        // 计算光照
        lightmapData[i] = CalculateLighting(i);
    }
}

void UpdateLightmapParallel() {
    std::vector<std::thread> threads;
    int numThreads = std::thread::hardware_concurrency();
    int chunkSize = lightmapData.size() / numThreads;

    for (int i = 0; i < numThreads; ++i) {
        int start = i * chunkSize;
        int end = (i == numThreads - 1) ? lightmapData.size() : start + chunkSize;
        threads.emplace_back(CalculateLightingThread, start, end, std::ref(lightmapData));
    }

    for (auto& thread : threads) {
        thread.join();
    }
}
使用GPU加速

使用OpenGL或CUDA进行GPU加速光照计算。以下是一个简单的OpenGL计算着色器示例:

#version 430 core
layout(local_size_x = 16, local_size_y = 16) in;

layout(binding = 0, rgba32f) uniform image2D lightmap;

uniform vec3 lightPos;
uniform vec3 lightColor;

void main() {
    ivec2 pixelCoords = ivec2(gl_GlobalInvocationID.xy);
    vec3 position = GetPositionFromCoords(pixelCoords);
    vec3 normal = GetNormalFromCoords(pixelCoords);

    vec3 lighting = CalculateLighting(position, normal, lightPos, lightColor);
    imageStore(lightmap, pixelCoords, vec4(lighting, 1.0));
}

在主程序中调用计算着色器:

void UpdateLightmapGPU() {
    glUseProgram(computeShaderProgram);

    glUniform3fv(glGetUniformLocation(computeShaderProgram, "lightPos"), 1, glm::value_ptr(lightPos));
    glUniform3fv(glGetUniformLocation(computeShaderProgram, "lightColor"), 1, glm::value_ptr(lightColor));

    glBindImageTexture(0, lightmapTexture, 0, GL_FALSE, 0, GL_WRITE_ONLY, GL_RGBA32F);

    glDispatchCompute(lightmapWidth / 16, lightmapHeight / 16, 1);
    glMemoryBarrier(GL_SHADER_IMAGE_ACCESS_BARRIER_BIT);
}

8. 高级应用

光照贴图不仅可以用于静态场景,还可以用于动态场景、全局光照和其他高级应用。

动态场景

在动态场景中,光源和物体的位置可能会发生变化。动态光照贴图可以实时更新光照信息,以适应这些变化。

全局光照

全局光照技术考虑了间接光照,例如光线追踪(Ray Tracing)或辐射度(Radiosity)。这些技术可以生成更真实的光照效果。

其他高级应用

光照贴图还可以用于其他高级应用,例如环境遮蔽(Ambient Occlusion)、体积光照(Volumetric Lighting)和光照探针(Light Probes)。

总结

通过以上步骤和技术,我们可以生成和应用更复杂和高效的光照贴图。光照贴图的优化和高级应用可以显著提高渲染性能和质量。希望这些信息对你有所帮助!如果你有任何进一步的问题或需要更详细的解释,请随时告诉我。

AI实战-加拿大的工业产品价格指数数据集分析预测实例(含4个源代码+18.20 MB完整的数据集) 代码手工整理,无语法错误,可运行。 包括:4个代码,共38.64 KB;数据大小:1个文件共18.20 MB。 使用到的模块: numpy pandas os sklearn.model_selection.train_test_split tensorflow.keras.models.Sequential tensorflow.keras.layers.Dense sklearn.impute.KNNImputer sklearn.impute.IterativeImputer sklearn.linear_model.LinearRegression matplotlib.pyplot sklearn.datasets.make_blobs sklearn.cluster.DBSCAN sklearn.neighbors.LocalOutlierFactor sklearn.ensemble.IsolationForest sklearn.svm.OneClassSVM sklearn.preprocessing.MinMaxScaler sklearn.preprocessing.StandardScaler sklearn.preprocessing.MaxAbsScaler sklearn.preprocessing.RobustScaler sklearn.preprocessing.PowerTransformer sklearn.preprocessing.QuantileTransformer sklearn.preprocessing.OneHotEncoder sklearn.preprocessing.LabelEncoder category_encoders seaborn sklearn.cluster.KMeans sklearn.metrics.silhouette_score sklearn.decomposition.PCA sklearn.datasets.load_iris scipy.cluster.hierarchy.linkage scipy.cluster.hierarchy.dendrogram sklearn.cluster.AgglomerativeClustering sklearn.mixture.GaussianMixture matplotlib warnings sklearn.metrics.mean_squared_error sklearn.metrics.r2_score plotly.express sklearn.ensemble.RandomForestRegressor sklearn.ensemble.GradientBoostingRegressor catboost.CatBoostRegressor sklearn.metrics.mean_absolute_error sklearn.model_selection.RandomizedSearchCV statsmodels.tsa.arima.model.ARIMA
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你一身傲骨怎能输

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值