OpenGL中启用光照前的准备——指定法线
本文出自杜晓萌的博客,请勿用于任何商业用途,转载请保持完整性并标明出处: http://blog.youkuaiyun.com/haohan_meng
墨衍会员
·
AI 创作全网分发
墨衍智能分发
本文由作者通过墨衍一键同步至各平台
1分发平台
7.4k累计阅读
7.4k平均单平台
已同步平台
优快云
微信公众号
微博
知乎
掘金
百家号
博客园
抖音
小红书
你的文章也可以这样分发
墨衍会员 ¥399起/年,写一次发全网
我也要 →
码龄16年
OpenGL中启用光照前的准备——指定法线
本文出自杜晓萌的博客,请勿用于任何商业用途,转载请保持完整性并标明出处: http://blog.youkuaiyun.com/haohan_meng
【OpenGL进阶笔记】
当前文章被以下社区和专栏收录:
基于QT与OpenGL的三维地球动态光照渲染实战
计算机图形学是研究如何在计算机中生成、处理和显示视觉内容的学科,其核心原理在于通过数学模型和算法将三维几何数据转换为二维屏幕图像。现代图形渲染管线,特别是可编程管线,允许开发者通过编写着色器程序精细控制光照、材质等视觉效果,这极大地提升了渲染的真实感和灵活性。其技术价值在于为游戏开发、科学可视化、地理信息系统(GIS)及虚拟现实等领域提供了强大的视觉表现基础。在GIS和科学可视化等应用场景中,动态、逼真的三维地球渲染是展示全球数据、模拟自然现象(如昼夜交替)的关键需求。本文聚焦于使用C++、QT和OpenG
openGL中关于顶点的法线、切线、副切线
openGL系列文章目录 前言 我们在openGL中绘制球体,或者圆环体的时候,经常可以到法线、切线、副切线这几个词,一脸疑惑,特别是副切线,这时什么鬼? 一、法线(normal) 物体模型由成百上千个平坦的三角形围成.三角形上附加纹理的方式来增加额外细节. 提升真实感. 但是近看时,就有问题了.变成平面.缺乏细节.原因: 物体表面并非平坦的. 而是表示出无数(凹凸不平的)细节.如果以光的视角来看这个问题:是什么使表面被视为完全平坦的表面来照亮? 这时就需要法线 法线定义 三维平面的法线是垂直于该平面的三维
OpenGL Shader:法线贴图实例编程
通过加载模型的法线贴图,我们可以在渲染过程中模拟出物体表面的微小细节,从而增强视觉效果。当然,实际应用中可能涉及更多的光照计算和材质属性,但这个示例代码可以作为一个入门点,让你开始使用法线贴图技术。首先,让我们了解一下法线贴图的基本原理。在本文中,我们将探讨如何在OpenGL着色器中实现法线贴图效果,并提供相应的源代码。在顶点着色器中,我们将模型的顶点位置、纹理坐标、法线和切线作为输入属性,并将它们传递给片段着色器。使用上述着色器,我们还需要加载模型的纹理和法线贴图,并将它们绑定到相应的纹理单元上。
OpenGL图形学开发中的“法线”
顶点通常是许多面共享的点,为了让光照看起来平滑,人们一般把这些面片的法线先算出来,然后对共享顶点上的这些面片法线求平均,再单位化。在曲面处(非平面多边形),每个顶点通常都有一个法线(vertex normal),这可以使光照看起来更平滑(Smooth shading)。通常再做单位化处理。(2) 通常我们使用单位法线(unit normal),也就是长度为1的向量,这样在后续光照计算中更方便(避免因长度不同引入误差)。对于隐式定义的曲面 F(x, y, z) = 0,则法线是梯度 ∇F(x, y, z)。
OpenGL 视差贴图 Parallax Mapping
OpenGL 视差贴图 Parallax Mapping视差贴图 Parallax Mapping简介视差贴图陡峭视差映射视差遮蔽映射 视差贴图 Parallax Mapping简介 视差贴图(Parallax Mapping)技术和法线贴图差不多,但它有着不同的原则。和法线贴图一样视差贴图能够极大提升表面细节,使之具有深度感。它也是利用了视错觉,然而对深度有着更好的表达,与法线贴图一起用能够产生难以置信的效果。视差贴图和光照无关,我在这里是作为法线贴图的技术延续来讨论它的。需要注意的是在开始学习视差贴图之
python——模拟砍价
类型:随机数。
【OpenGL】二十二、OpenGL 光照效果 ( 模型准备 | 光照设置 | 启用光照 | 启用光源 | 设置光源位置 | 设置光照参数 | 设置环境光 | 设置反射材质 | 设置法线 )
一、模型准备、 二、光照设置、 1、启用光照设置、 2、启用光源、 3、设置光照参数、 4、设置环境光、 5、设置反射材质、 三、光照法线设置、 1、设置光源位置、 2、设置法线、 3、代码示例及运行效果、 四、相关资源、
Quanto option期权公式推导(更新中)
Quanto期权不同于以标的股票或资产的计价货币支付最终收益的普通欧式期权,它以另一种货币以预先确定的汇率支付最后的收益。以股票B的计价货币来计价的quanto看涨期权的收益为F0×max(Sa(T)−K,0)×Sb(T)F_0 \times \max(S_a(T)-K, 0) \times S_b(T)F0×max(Sa(T)−K,0)×Sb(T) 其中SaS_aSa以货币A计价,SbS_bSb以货币B计价,F0F_0F0是预先固定的汇率. 假设上述股票均遵循几何布朗运动,可以得到以下恒等式
OpenGL生成的法线贴图并增加光照
这一篇将由OpenGL生成法线贴图的基础上再增加光照效果。 思路如下: 准备一张墙壁图片A。 通过A自动生成法线贴图。 设计一个平行光,指定平行光的光照颜色和光照方向。 使用漫反射光照公式,法线贴图和光照方向进行点乘。 计算出光照渲染出的高光部分和阴影部分,和A进行乘法操作。 原图如下: 首先验证是否生成法线贴图,代码如下: #iChannel0"file://./wall.jpeg" f...
PCB布局布线要求及多层电路板叠加原则
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考本文主要针对PCB布局布线中的要点进行了总结,并对多层电路板的叠加原则进行了解释。
为什么你的SSE连接总断?深入对比EventSource与fetch-event-source的5大差异点
本文深入对比了原生EventSource与@microsoft/fetch-event-source库在SSE连接稳定性上的五大关键差异。重点剖析了后者在请求能力、连接控制、错误处理、数据解析及性能优化方面的优势,特别是其支持POST请求、自定义Header、精细化的重连策略与生命周期管理,为解决生产环境中SSE连接频繁断开的问题提供了专业方案。
OpenGL 光照
OpenGL 中实现光照的基本原理是Phong 光照模型,它将光照分解为环境光、漫反射光和镜面光三部分。实现的关键在于:提供正确的法线数据在世界空间中进行所有光照计算(需要正确变换顶点位置和法线)在片段着色器中为每个像素执行光照计算通过Uniform变量将光源、材质和摄像机属性传递给着色器。
Sony DPT RP1/CP1破解攻略
前言 自己有一台Sony DPT CP1和一台kindle,两个都已经用了很多年。直到最近发现微信读书上经常可以找到一些免费而且不错的书,所以就萌生了在两台机器上使用微信读书的想法。kindle比较容易实现,直接打开内置浏览器,进入微信读书网页版就行了,而Sony的电纸书则只能通过破解+安装微信读书的方式实现。大概弄了两三个小时吧,也遇到了一些问题,所以这里记录一下整个过程,希望能方便后来的使用者。 首先感谢HappyZ, osc_t5nbj8ds。前者是提供公开破解的方法的大神,后者则是解决了我遇到的问题
【OpenGL】openGL 法线贴图
本文介绍了法线贴图的核心原理与实现方法。法线贴图通过RGB值存储表面法线信息(0-1映射到-1-1),其蓝色调源于法线通常指向曲面外侧。关键难点在于将切线空间法线转换到模型空间,这需要构建由切线(T)、副切线(B)和法线(N)组成的TBN矩阵。文章详细推导了通过三角形边和UV差值计算切线与副切线的数学过程,并提供了C++实现代码。在着色器实现部分,需新增切线和副切线缓冲区,通过TBN矩阵的转置完成空间转换。文末给出了完整的绘制代码框架,包括缓冲区创建、纹理加载和矩阵计算等关键步骤。
解析 RABAX during SAPGUI Logon 错误及其解决方案
登录用户关联了初始启动程序,该程序由于未处理的异常导致运行时错误。在 ST22 查看错误的程序名和错误行。修复初始程序代码中的逻辑问题。重新部署修复后的代码。示例代码:防止未处理的异常TRY." 模拟逻辑处理ENDTRY.此代码通过 TRY-CATCH 块捕获潜在错误,避免程序崩溃。是 SAP 系统中常见的运行时错误,其根源可能涉及多个方面,包括用户配置、系统状态、数据库连接和自定义开发等。通过结合 ST22、SM21 等诊断工具,以及完善的代码实践和系统监控,可以有效预防和解决此类问题。
学 Simulink—— 基于高频方波电压注入的表贴式永磁电机无感控制仿真
本文手把手教授基于Simulink的高频方波电压注入法实现表贴式永磁同步电机(SPMSM)无传感器控制。针对表贴式电机微弱凸极特性(Lq/Ld≈1.05-1.15),详解方波注入相比正弦注入的优势:通过5kHz方波(PWM频率半值)集中能量提升信噪比,并采用相邻周期电流直接相减的零延迟分离技术。系统架构包含高频注入器、无滤波器信号分离模块、锁相环观测器和磁饱和极性辨识等关键环节,提供参数设置经验(如注入幅值10-15%Vdc)和典型性能指标(位置误差<0.2rad)。特别强调工程实现要点:PWM同步时
【OpenGL】openGL 基本着色
本文介绍了OpenGL中基础光照模型的实现。首先讲解了法线向量的概念,包括三角形法线和顶点法线的计算方法,以及在OpenGL中的使用方式。接着重点阐述了漫反射光照分量的原理,通过计算光线与表面法线的夹角来模拟光强变化,并加入了材质颜色和光源强度的影响。随后引入环境光分量来模拟间接光照效果。最后简要提及镜面反射分量,为后续高级着色技术做铺垫。教程通过伪代码和渲染效果图展示了不同光照分量的实现方法和视觉效果,为初学者构建了基本的光照模型框架。
uniapp - 最新实现hbuilder项目运行到ios基座或苹果ios真机设备详细教程,如何在ios苹果手机上真机运行测试,IOS自定义基座在线打包调试(uniapp项目如何在苹果手机上运行调试)
uni-app,苹果,app,ios,设备,自定义基座,运行app到苹果手机,mac电脑,Xcode,hbuilderX,运行ios基座调试Uniapp,无需打包,苹果证书,ipa,运行失败,报错,无法启动,连接失败,出错,详细教程,如何解决这个问题,怎么办,申请iOS证书,运行项目到iOS基座,打包ios自定义基座,在iOS真机上运行,新手小白,超级详细的教程,dcloud如何苹果ios系统真机测试,调试基座失败,真机调试ios app,App基座安装后无法打开问题,真机运行时检测不到手机的问题或者基座安
OpenGL入门:手把手教你实现3D光照效果(含完整代码解析)
作为一名OpenGL小白,当我第一次看到光照相关的代码时,整个人是懵的——为什么要多出那么多顶点数据?那个小方块是什么?法线又是干什么用的?如果你也有同样的困惑,这篇文章就是为你准备的。我将通过一个完整的示例,带你逐行理解OpenGL中基本光照的实现。最终效果:一个受光照影响的彩色立方体 + 一个表示光源位置的小方块,支持摄像机移动。
复分析 阿尔福斯(Ahlfors) 第三版答案 英文
答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案
锂电池充电器电路设计 里面有电路
锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。
OpenGL 渲染测试 1:基础光照(Phong Lighting Model)
参考:https://learnopengl-cn.github.io/02 Lighting/02 Basic Lighting/ **本贴目的:**本贴在 learnOpengl 教程的基础上增加了 Dear-imgui,可以方便地调节一些关键参数来观看不同的光照效果 颜色 颜色由红绿蓝(RGB)三个分量组成,在OpenGL中范围为0~1。 现实生活中我们看到某一物体的颜色并不是物体真正的颜色...
汉书HE8,好用的汇编代码编写工具
汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大
IC-Light:2D原画还在手绘法线贴图?快速单张平涂秒接Unity实时动态光照
今天分享这套极度冷门却异常硬核的“2D 动态光照法线速通术”,专为被“引擎动态光”折磨的 2D 原画师与技术美术(TA)打造。
深度学习工具包 DeepLearningToolbox
深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[](https://bitdeli.com/free "Bitdeli Badge")
OpenGL基础46:切线空间
前置:OpenGL基础11:空间 一、什么是切线空间(Tangent Space) 在《OpenGL基础11:空间》中提到了观察空间、裁剪空间、世界空间等。切线空间和它们一样,都属于坐标空间 上面就是一个切线空间的例子,对于切线空间: N:该顶点本身的法线方向,z轴 T:该顶点的一条切线,但由于切线数量有无数条,其一般由模型给定,对应着UV图中的U,也就是使用和纹理坐标方向相同的那条 B:由前两者叉乘得到,对应着UV图中的V UV图:用于告知计算机,如何用2维的贴图包住3维的物体,本...
OpenGL冯氏光照模型实现:从原理到C++/GLSL代码实战
在计算机图形学中,光照模型是模拟光线与物体表面交互、生成真实感3D图像的核心技术。其基本原理是通过数学公式计算光线在物体表面的反射、折射等行为,从而模拟出环境光、漫反射和镜面反射等视觉效果。这项技术的价值在于,它能让二维屏幕上的几何模型呈现出立体感、质感和空间关系,是游戏开发、虚拟现实、建筑可视化等领域的基石。冯氏光照模型作为一种经典且高效的模型,将复杂的光照计算分解为环境光、漫反射和镜面反射三个可独立控制的分量,平衡了视觉效果与计算性能。在OpenGL等图形API的工程实践中,实现光照涉及顶点与片段着色器
OpenGL高级光照系统完全指南:环境光、镜面光与高光效果实现
OpenGL高级光照系统是创建逼真3D图形的核心技术,它通过环境光、镜面光和高光效果模拟真实世界的光照行为。💡 在opengl-series项目中,Thomas Dalling提供了一套完整的现代OpenGL光照实现方案,帮助开发者掌握专业级的光照渲染技术。 ## 🌟 高级光照系统核心概念 OpenGL高级光照系统基于Phong光照模型,通过三种主要光照分量来模拟真实光照效果: ###
[OpenGL] opengl切线空间
对于法线贴图来说,我们知道它就是一个2D的颜色纹理,根据rgb来映射法线对应的xyz,从而达到在同一个平面上有多个不同方向法线的效果,这样就能根据光照的计算结果不同,从而得到凹凸不平(或者说更加细节)的平面。
现代OpenGL光照模型实现:Phong光照、环境光与镜面反射完全指南
OpenGL作为图形渲染的行业标准,其光照系统是创建真实感3D场景的核心。本文将通过实例详解Phong光照模型的实现原理,帮助开发者掌握环境光、漫反射和镜面反射的计算方法,打造出具有专业视觉效果的3D应用。 ## Phong光照模型基础:三大核心组件 Phong光照模型通过叠加三种不同类型的光来模拟真实世界的光照效果,这三种光分别是环境光、漫反射光和镜面反射光。该模型由计算机图形学先驱Bui
419
5918
411
1971
3683
1万+

被折叠的 条评论
为什么被折叠?



