当前位置: 首页 > news >正文

OpenGL学习笔记(模型材质、光照贴图)

目录

  • 光照与材质
  • 光照贴图
    • 漫反射贴图
    • 采样镜面光贴图

GitHub主页:https://github.com/sdpyy
OpenGL学习仓库:https://github.com/sdpyy1/CppLearn/tree/main/OpenGLtree/main/OpenGL):https://github.com/sdpyy1/CppLearn/tree/main/OpenGL

光照与材质

在现实世界里,每个物体会对光产生不同的反应。比如,钢制物体看起来通常会比陶土花瓶更闪闪发光,一个木头箱子也不会与一个钢制箱子反射同样程度的光。有些物体反射光的时候不会有太多的散射(Scatter),因而产生较小的高光点,而有些物体则会散射很多,产生一个有着更大半径的高光点。如果我们想要在OpenGL中模拟多种类型的物体,我们必须针对每种表面定义不同的材质(Material)属性。
在这里插入图片描述

当描述一个表面时,我们可以分别为三个光照分量定义一个材质颜色(Material Color):环境光照(Ambient Lighting)、漫反射光照(Diffuse Lighting)和镜面光照(Specular Lighting),再添加一个反光度(Shininess)分量。将这个结构体写入片段着色器,简单理解就是把物体颜色分成了三部分,然后在三种光照计算中分别使用,最后直接将光照相加即可

#version 330 core
out vec4 FragColor;// 材质结构体
struct Material {vec3 ambient;vec3 diffuse;vec3 specular;float shininess;
};// 法线
in vec3 Normal;
// 像素对应空间位置
in vec3 FragPos;
// 光照位置
uniform vec3 lightPos;
// 光照颜色
uniform vec3 lightColor;
// 摄像机位置
uniform vec3 viewPos;
// 材质
uniform Material material;
void main()
{// 环境光vec3 ambient = lightColor * material.ambient;// 漫反射vec3 norm = normalize(Normal);vec3 lightDir = normalize(lightPos - FragPos);float diff = max(dot(norm,lightDir),0.0);vec3 diffuse = lightColor * (diff * material.diffuse);// 高光反射vec3 viewDir = normalize(viewPos - FragPos);vec3 reflectDir = reflect(-lightDir, norm);float spec = pow(max(dot(viewDir, reflectDir), 0.0), 32);vec3 specular = (spec * material.specular) * lightColor;// 综合vec3 result = ambient + diffuse + specular;FragColor = vec4(result, 1.0);
}

对于结构体的uniform,赋值方法比较简单

lightingShader.setVec3("material.ambient",  1.0f, 0.5f, 0.31f);
lightingShader.setVec3("material.diffuse",  1.0f, 0.5f, 0.31f);
lightingShader.setVec3("material.specular", 0.5f, 0.5f, 0.5f);
lightingShader.setFloat("material.shininess", 32.0f);

在这里插入图片描述
这个物体太亮了。物体过亮的原因是环境光、漫反射和镜面光这三个颜色对任何一个光源都全力反射。同样,我们可以对光源的环境光、漫反射和镜面光属性进行分别设置。这样设置可以对被光照物体的比如环境光强度统一设置

struct Light {vec3 position;vec3 ambient;vec3 diffuse;vec3 specular;
};uniform Light light;

这样设置光照

        cubeShader.setVec3("light.ambient",  0.2f, 0.2f, 0.2f);cubeShader.setVec3("light.diffuse",  0.5f, 0.5f, 0.5f); // 将光照调暗了一些以搭配场景cubeShader.setVec3("light.specular", 1.0f, 1.0f, 1.0f);cubeShader.setVec3("light.position", lightPos);

在这里插入图片描述
下面可以做一些有趣的处理,让光源的ambientColor和diffuseColor随时间变化

        glm::vec3 lightColor;lightColor.x = sin(glfwGetTime() * 2.0f);lightColor.y = sin(glfwGetTime() * 0.7f);lightColor.z = sin(glfwGetTime() * 1.3f);glm::vec3 diffuseColor = lightColor   * glm::vec3(0.5f); // 降低影响glm::vec3 ambientColor = diffuseColor * glm::vec3(0.2f); // 很低的影响cubeShader.setVec3("light.ambient", ambientColor);cubeShader.setVec3("light.diffuse", diffuseColor);

光照贴图

在上一节中,我们将整个物体的材质定义为一个整体,但现实世界中的物体通常并不只包含有一种材质,而是由多种材质所组成。想想一辆汽车:它的外壳非常有光泽,车窗会部分反射周围的环境,轮胎不会那么有光泽,所以它没有镜面高光,轮毂非常闪亮(如果你洗车了的话)。汽车同样会有漫反射和环境光颜色,它们在整个物体上也不会是一样的,汽车有着许多种不同的环境光/漫反射颜色。总之,这样的物体在不同的部件上都有不同的材质属性。

漫反射贴图

我们希望通过某种方式对物体的每个片段单独设置漫反射颜色。用纹理就能实现。其实都是使用一张覆盖物体的图像,让我们能够逐片段索引其独立的颜色值。在光照场景中,它通常叫做一个漫反射贴图(Diffuse Map)。这也就解释了为什么把纹理作为漫反射系数。

将Material的漫反射项改为采样器,通过UV坐标采样漫反射贴图,这里还移除了环境光,因为因为环境光颜色在几乎所有情况下都等于漫反射颜色

struct Material {sampler2D diffuse;vec3      specular;float     shininess;
}; 

之后就是常规的把采样器设置好,就可以了。提供一个加载纹理的方法

// 加载材质返回纹理ID
GLuint loadTexture(char const * path)
{GLuint textureID;glGenTextures(1, &textureID);int width, height, nrComponents;unsigned char *data = stbi_load(path, &width, &height, &nrComponents, 0);if (data){GLenum format;if (nrComponents == 1)format = GL_RED;else if (nrComponents == 3)format = GL_RGB;else if (nrComponents == 4)format = GL_RGBA;glBindTexture(GL_TEXTURE_2D, textureID);glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0, format, GL_UNSIGNED_BYTE, data);glGenerateMipmap(GL_TEXTURE_2D);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_MIPMAP_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);stbi_image_free(data);}else{std::cout << "Texture failed to load at path: " << path << std::endl;stbi_image_free(data);}return textureID;
}

在这里插入图片描述

采样镜面光贴图

虽然纹理颜色上了,但是木头和铁边的高光应该是不一样的,所以高光的系数也需要一张贴图来定义,来保证不同的位置高光系数是不一样的,下图就表示边上才有颜色,中间对高光的贡献小
在这里插入图片描述
同样,把高光颜色也设置为采样器

struct Material {sampler2D diffuse;sampler2D specular;float     shininess;
};

最终就只有铁边反射
在这里插入图片描述

相关文章:

OpenGL学习笔记(模型材质、光照贴图)

目录 光照与材质光照贴图漫反射贴图采样镜面光贴图 GitHub主页&#xff1a;https://github.com/sdpyy OpenGL学习仓库:https://github.com/sdpyy1/CppLearn/tree/main/OpenGLtree/main/OpenGL):https://github.com/sdpyy1/CppLearn/tree/main/OpenGL 光照与材质 在现实世界里&…...

视觉_transform

visual_transform 图像分块 (Patch Embedding) 假设输入图像为 x ∈ R ∗ H ∗ ∗ W ∗ ∗ C ∗ x∈R^{*H**W**C*} x∈R∗H∗∗W∗∗C∗ C 是图像的通道数&#xff08;例如&#xff0c;RGB图像的 C3&#xff09; 将图像分割成N个大小为P*CP的patch&#xff0c;每个patch的大…...

Redis的安装及通用命令

二. Redis 的安装及通用命令 1. Ubuntu 安装 Redis (1) 切换到 root 用户: su root(2) 搜索 Redis 软件包 apt search redis(3) 安装 Redis apt install redis(4) 查看 Redis netstat -anp | grep redis(5) 切换到 Redis 目录下 cd /etc/redis/(6) 修改 Redis 配置文件:…...

Python 实现的运筹优化系统代码详解(0-1规划背包问题)

一、引言 在数学建模与实际决策场景的交织领域中&#xff0c;诸多复杂问题亟待高效且精准的解决方案。0-1 规划作为一种特殊且极为重要的优化方法&#xff0c;宛如一把万能钥匙&#xff0c;能够巧妙开启众多棘手问题的解决之门。它专注于处理决策变量仅能取 0 或 1 这两种极端状…...

护网蓝初面试题

《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…...

音视频学习(三十二):VP8和VP9

VP8 简介 全称&#xff1a;Video Processing 8发布者&#xff1a;原 On2 Technologies&#xff08;2010 被 Google 收购&#xff09;定位&#xff1a;开源视频压缩标准&#xff0c;主要竞争对手是 H.264应用&#xff1a; WebRTC 视频通信HTML5 <video> 标签&#xff08…...

美国mlb与韩国mlb的关系·棒球9号位

MLB&#xff08;Major League Baseball&#xff0c;美国职业棒球大联盟&#xff09;作为全球最高水平的职业棒球联赛&#xff0c;与韩国市场流行的“MLB”时尚品牌之间存在着授权合作关系&#xff0c;但两者在业务范畴和品牌定位上存在显著差异。 一、品牌授权背景&#xff1a;…...

免费在线PUA测试工具:识别情感操控,守护情感健康

免费在线PUA测试工具&#xff1a;识别情感操控&#xff0c;守护情感健康 你是否曾经在感情中感到困惑、不安&#xff0c;甚至怀疑自己&#xff1f;今天为大家推荐一个专业的PUA测试工具&#xff0c;帮助你识别是否正在经历情感操控。 测试工具链接&#xff1a;PUA测试工具 什么…...

nginx中的try_files指令

try_files 是 Nginx 中一个非常有用的指令&#xff0c;用于按顺序检查文件是否存在&#xff0c;并返回第一个找到的文件。如果所有指定的文件都不存在&#xff0c;则执行回退逻辑&#xff0c;如重定向到一个指定的 URI 或返回一个错误代码。 作用 文件查找&#xff1a;按顺序检…...

[特殊字符] 驱动开发硬核特训 · Day 4

主题&#xff1a;从硬件总线到驱动控制 —— I2C 协议与传感器驱动开发全解析 I2C&#xff08;Inter-Integrated Circuit&#xff09;总线是一种广泛用于嵌入式设备的串行通信协议&#xff0c;因其低成本、简单布线和多从设备支持&#xff0c;成为连接各种传感器&#xff08;温…...

Python 实现玻璃期货数据处理、入库与分析:从代码到应用

Python 实现期货数据处理与分析&#xff1a;从代码到应用 引言 在金融市场中&#xff0c;期货数据的处理和分析对于投资者和分析师来说至关重要。Python 凭借其丰富的库和简洁的语法&#xff0c;成为了处理和分析期货数据的强大工具。本文将详细解读一段用于处理期货持仓和行…...

神经网络之损失函数

引言&#xff1a;损失函数 &#xff08;Loss Function&#xff09;是机器学习和深度学习中非常重要的一个概念。用于衡量模型的预测值与真实值之间的差异&#xff0c;从而指导模型优化其参数以最小化这种差异。 一、损失函数作用 量化误差&#xff1a;损失函数是将预测值和真实…...

在Ubuntu内网环境中为Gogs配置HTTPS访问(通过Apache反向代理使用IP地址)

一、准备工作 确保已安装Gogs并运行在HTTP模式(默认端口3000) 确认服务器内网IP地址(如192.168.1.100) 二、安装Apache和必要模块 sudo apt update sudo apt install apache2 -y sudo a2enmod ssl proxy proxy_http rewrite headers 三、创建SSL证书 1. 创建证书存储目录…...

printf

printf() 是 C 和 C 标准库中的一个输出函数&#xff0c;位于 <cstdio> 头文件中。下面为你详细介绍它的相关知识点。 1. 基本使用 printf() 函数的作用是按照指定格式将数据输出到标准输出设备&#xff08;通常是控制台&#xff09;。其基本语法如下&#xff1a; cpp …...

Leetcode 311 Sparse Matrix Multiplication 稀疏矩阵相乘

Problem Given two sparse matrices A and B, return the result of AB. You may assume that A’s column number is equal to B’s row number. Example: A [[ 1, 0, 0],[-1, 0, 3] ]B [[ 7, 0, 0 ],[ 0, 0, 0 ],[ 0, 0, 1 ] ]| 1 0 0 | | 7 0 0 | | 7 0 0 | AB …...

mysql和sqlite关于data数据的识别问题

<input type"date" name"birthday" value""> # 表单传入的日期 birthday request.form.get(birthday) # 获取日期 birthday Column(birthday, Date, comment出生日期, nullableTrue) # 数据库的数据字段模型 birthday_str request…...

2024 天梯赛——工业园区建设题解

思路 将点 i i i 视为固定点&#xff0c; 点 j j j 视为灵活点&#xff0c;其中 s i 1 s_{i} 1 si​1&#xff0c; s j 0 s_{j} 0 sj​0。维护四个队列&#xff0c;其中 q 0 q_{0} q0​ 和 q 1 q_{1} q1​ 分别维护还没有被选用的固定点 和 灵活点&#xff0c; Q 0 Q…...

亚马逊AI新功能上线:5大亮点解锁精准消费预测

在人工智能技术不断重塑跨境电商生态之际&#xff0c;全球电商巨头亚马逊&#xff08;Amazon&#xff09;再次迈出关键一步。近日&#xff0c;亚马逊正式对其卖家中心推出一系列基于AI的新功能&#xff0c;聚焦于消费数据预测、用户行为洞察、库存智能管理与个性化营销服务等方…...

opus+ffmpeg+c++实现录音

说明&#xff1a; opusffmpegc实现录音 效果图&#xff1a; step1:C:\Users\wangrusheng\source\repos\WindowsProject1\WindowsProject1\WindowsProject1.cpp // WindowsProject1.cpp : 定义应用程序的入口点。 //#include "framework.h" #include "Windows…...

ComfyUI的本地私有化部署使用Stable Diffusion文生图

什么是ComfyUI &#xff1f; ComfyUI是一个基于节点流程的Stable Diffusion操作界面。以下是关于它的详细介绍&#xff1a; 特点与优势 高度可定制&#xff1a;提供丰富的节点类型&#xff0c;涵盖文本处理、图像处理、模型推理等功能。用户可根据需求自由组合节点&#xff0…...

【学习笔记17】Windows环境下安装RabbitMQ

一. 下载RabbitMQ&#xff08; 需要按照 Erlang/OTP 环境的版本依赖来下载&#xff09; (1) 先去 RabbitMQ 官网&#xff0c;查看 RabbitMQ 需要的 Erlang 支持&#xff1a;https://www.rabbitmq.com/ 进入官网&#xff0c;在 Docs -> Install and Upgrade -> Erlang V…...

【LeetCode 热题100】55:跳跃游戏(详细解析)(Go语言版)

&#x1f680; LeetCode 热题 55&#xff1a;跳跃游戏&#xff08;Jump Game&#xff09;完整解析 &#x1f4cc; 题目描述 给定一个非负整数数组 nums&#xff0c;你最初位于数组的第一个下标。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一…...

OpenCV轮廓检测全面解析:从基础到高级应用

一、概述 轮廓检测是计算机视觉中的基础技术&#xff0c;用于识别和提取图像中物体的边界。与边缘检测不同&#xff0c;轮廓检测更关注将边缘像素连接成有意义的整体&#xff0c;形成封闭的边界。 轮廓检测的核心价值 - 物体识别&#xff1a;通过轮廓可以识别图像中的独立物体…...

微服务入门:Spring Boot 初学者指南

大家好&#xff0c;这里是架构资源栈&#xff01;点击上方关注&#xff0c;添加“星标”&#xff0c;一起学习大厂前沿架构&#xff01; 微服务因其灵活性、可扩展性和易于维护性而成为现代软件架构的重要组成部分。在本博客中&#xff0c;我们将探讨如何使用 Spring Boot 构建…...

Windows环境下开发pyspark程序

Windows环境下开发pyspark程序 一、环境准备 1.1. Anaconda/Miniconda&#xff08;Python环境&#xff09; 如果不怕包的版本管理混乱&#xff0c;可以直接使用已有的Python环境。 需要安装anaconda/miniconda&#xff08;python3.8版本以上&#xff09;&#xff1a;Anaconda…...

嵌入式学习笔记——大小端及跳转到绝对地址

大小端以及跳转到绝对地址 0x100000 嵌入式编程中的大小端详解一、大端模式与小端模式二、判断当前系统是大端还是小端方法一&#xff1a;指针强制类型转换方法二&#xff1a;使用联合体&#xff08;union&#xff09; 三、结构体位段和大小端的影响四、大小端影响内存的 memc…...

eprime相嵌模式实验设计

一、含义与模型结构 该模式的实验设计至少 由两个存储不同实验材料及 属性的List和一个核心实验 过程CEP组成。子list1和 list2相嵌在父List中&#xff0c;CEP 可以调用List中的材料&#xff0c;也 可以调用list1和list2中的材 料。 二、相嵌模式的应用 应用于解决“多重随…...

编译uboot的Makefile编写

make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- distcleanmake ARCHarm CROSS_COMPILEarm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfigmake V1 ARCHarm CROSS_COMPILEarm-linux-gnueabihf- -j12 这三条命令中 ARCHarm 设置目标为 arm 架构&#xff0c; CROSS_COMP…...

Go语言常用算法实现

以下是Go语言中常用的算法实现&#xff0c;涵盖排序、搜索、数据结构操作等核心算法。 一、排序算法 1. 快速排序 func QuickSort(arr []int) []int {if len(arr) < 1 {return arr}pivot : arr[0]var left, right []intfor i : 1; i < len(arr); i {if arr[i] < pi…...

Windows上使用NSSM注册定时服务

适用和不适用场景 适用场景 持续运行 的脚本或程序&#xff08;如 Laravel 的 schedule:run 每分钟检查任务&#xff09;后台常驻 的任务或服务&#xff08;如监听服务、实时同步&#xff09; 不适用场景 低频次任务&#xff08;如每日/每周备份&#xff09; NSSM 常驻内存…...

【Gorm】模型定义

intro package mainimport ("gorm.io/gorm""gorm.io/driver/sqlite" // GORM 使用该驱动来连接和操作 SQLite 数据库。 )type Product struct {gorm.Model // 嵌入GORM 内置的模型结构&#xff0c;包含 ID、CreatedAt、UpdatedAt、DeletedAt 四个字段Cod…...

程序化广告行业(65/89):AdX/SSP系统深度剖析与实战要点

程序化广告行业&#xff08;65/89&#xff09;&#xff1a;AdX/SSP系统深度剖析与实战要点 大家好&#xff01;一直以来&#xff0c;我都对程序化广告领域充满热情&#xff0c;这个领域发展迅速且不断涌现新的技术和模式。之前我们探讨了程序化广告的一些基础内容&#xff0c;…...

算法刷题记录——LeetCode篇(2.7) [第161~170题](持续更新)

更新时间&#xff1a;2025-04-06 算法题解目录汇总&#xff1a;算法刷题记录——题解目录汇总技术博客总目录&#xff1a;计算机技术系列博客——目录页 优先整理热门100及面试150&#xff0c;不定期持续更新&#xff0c;欢迎关注&#xff01; 169. 多数元素 给定一个大小为…...

conda安装指定版本python环境

1. 创建指定 Python 版本的环境 使用以下命令创建环境&#xff0c;并将 <env_name> 替换为你的环境名称&#xff0c;<python_version> 替换为具体的 Python 版本&#xff08;如 3.8, 3.9 等&#xff09; conda create -n <env_name> python<python_vers…...

PH热榜 | 2025-04-05

1. Comp AI 标语&#xff1a;开源的 Vanta 和 Drata 替代方案 介绍&#xff1a;这款开源的 Drata 和 Vanta 替代方案&#xff0c;能够帮助你在几周内&#xff0c;轻松满足 SOC 2、ISO 27001 和 GDPR 等合规框架的要求&#xff0c;而不是像往常那样拖延数月。 产品网站&#…...

C++之红黑树

目录​​​​​​​ 一、红黑树的概念 1.1、红黑树的规则 1.2、红黑树如何确保最长路径不超过最短路径的二倍 1.3、红黑树的效率 二、红黑树的实现 2.1、红黑树的结构 2.2、红黑树的插入 2.2.1、红黑树插入一个值的大概过程 2.2.2、情况一&#xff1a;变色 2.2.3、情…...

各个语言对不同数据结构的叫法

一、基础数据结构对比 数组&#xff08;Array&#xff09;‌ C/C‌&#xff1a;固定大小数组&#xff08;int arr&#xff09;&#xff0c;动态数组通过vector&#xff08;C&#xff09;实现 ‌ Java‌&#xff1a;固定数组&#xff08;int[]&#xff09;&#xff0c;动态数组…...

蓝桥杯 web 水果拼盘 (css3)

做题步骤&#xff1a; 看结构&#xff1a;html 、css 、f12 分析: f12 查看元素&#xff0c;你会发现水果的高度刚好和拼盘的高度一样&#xff0c;每一种水果的盘子刚好把页面填满了&#xff0c;所以咱们就只要让元素竖着排列&#xff0c;加上是竖着&#xff0c;排不下的换行…...

算法专题(八):分治-归并排序

目录 一、排序数组 1.1 题目 2.2 思路 2.3 代码实现 二、LCR 170. 交易逆序对的总数 &#xff08;数组中的逆序对&#xff09; 2.1 题目 2.2 思路 方法一&#xff1a;快速统计出某个数前面有多少个数比它大 方法二&#xff1a;快速统计出某个数后面有多少个数比它小 …...

51单片机使用定时器实现LCD1602的时间显示(STC89C52RC)

本文前半部分直接给出实现&#xff08;注意进位问题是秒->分->小时&#xff0c;用 if 嵌套即可实现&#xff09;&#xff0c;后半部分讲解定时器和中断系统。 效果展示&#xff1a; LCD1602电路图&#xff1a; 项目结构&#xff1a; 代码实现&#xff1a; main.c #…...

微软2025年AI技术深度解析:从多模态大模型到企业级代理服务

微软2025年AI技术深度解析&#xff1a;从多模态大模型到企业级代理服务 一、微软AI技术全景概览 在2025年的AI领域&#xff0c;微软通过Azure AI Foundry、多模态大模型、企业级AI代理三大核心技术&#xff0c;构建了覆盖开发、部署、应用全流程的AI生态体系。根据最新财报数…...

24 设计模式总结

设计模式分类&#xff08;意图&#xff09; • 创建型模式&#xff1a;创建对象的机制&#xff0c;从所需要实例化的对象中解耦。 • 结构型模式&#xff1a;将对象或类组装到更大的结构中。 • 行为型模式&#xff1a;负责对象间的交互和分配职责。分类的目的是为了更抽象的了…...

【ARTS】2873.有序三元组中的最大值!

前言 仅做学习使用&#xff0c;侵删 什么是ARTS&#xff1f; 算法(Algorithm): 每周至少一道LeetCode算法题&#xff0c;加强编程训练和算法学习 阅读(Review)&#xff1a; 阅读并点评至少一篇英文技术文章&#xff0c;提高英文水平 技巧 (Tip)&#xff1a;学习至少一个技…...

Mysql进阶

目录 一.Mysql架构 1.连接层 2.服务层 3.引擎层 4.物理文件存储层 二.Mysql引擎 1.InnoDB 2.MyISAM 三.索引 1.什么是索引 2.为什么要有索引 3.索引的原理 4.索引优势 5.索引劣势 6.索引分类 主键索引 唯一索引 单值索引 组合索引&#xff08;复合索引&#…...

探秘JVM内部

在我们编写Java代码&#xff0c;点击运行后&#xff0c;会发生什么事呢&#xff1f; 首先&#xff0c;Java源代码会经过Java编译器将其编译成字节码&#xff0c;放在.class文件中 然后这些字节码文件就会被加载到jvm中&#xff0c;然后jvm会读取这些文件&#xff0c;调用相关…...

c语言学习12天

c语言的宏定义&#xff1a;宏定义单纯的文本替换不会检查语法是否合法 #include #pragma 以及开头的#都属于预处理指令 预处理指令&#xff1a;在gcc编译套件中的cpp预处理器对程序进行编译之前所做的一些动作&#xff0c;如#include预处理指令就是在程序编译之前有预处理器…...

公司内网部署离线deepseek本地模型实战

企业内部可能有些数据比较敏感&#xff0c;不能连接互联网。deepseek来提高工作效率&#xff0c;这个时候你可以利用ollama在内网本地部署来实现。 本式样是先在自己电脑上用虚拟机部署好&#xff0c;再用U盘把虚拟机文件复制到内网去。 一、使用VMware新建WIN2022虚拟机 &a…...

rocketmq中的延迟队列使用详解

RocketMQ的延迟队列通过预设的延迟等级实现消息的定时投递&#xff0c;适用于订单超时、定时通知等高并发场景。以下是其核心原理、使用方式及优化策略的详细解析&#xff1a; 一、实现原理 延迟等级机制 RocketMQ默认提供18个固定延迟等级&#xff08;1s、5s、10s、30s、1m、2…...

VB.NET Asp.Net Core模板WebAPI应用-宝塔面板Linux系统通过Docker部署

宝塔面板支持在Linux系统上部署Docker容器吗&#xff1f; 如何在宝塔面板上通过Docker部署VB.NET应用&#xff1f; Docker容器中的VB.NET Asp.Net Core WebAPI应用如何配置&#xff1f; 一,首先,创建一个ASP.NET Core测试项目 1.1 打开VS2019/2022,创建一个.NTE6 Core控制台应…...

4985 蜗牛

4985 蜗牛 ⭐️难度&#xff1a;中等 ⭐️考点&#xff1a;2023、省赛、动态规划 &#x1f4d6; &#x1f4da; import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner sc new Sc…...