OpenGL中启用光照前的准备——指定法线

LearnOpenGL——法线贴图、视差贴图学习笔记 我们将观察方向变化到切线空间中,所以P向量的x和y分量会与表面切线和副切线对齐,由于切线和副切线向量与表面纹理坐标的方向相同,我们可以用P的x和y元素作为纹理坐标的偏移量。目前,如果我们让平面竖直面对我们,此时效果正常,因为法线贴图中的法线方向指向z正方向并且平面的法线也指向z轴正方向。将法线向量的x、y、z元素储存到纹理中,代替颜色的r、g、b元素,因为法线向量的范围在[-1,1],所以我们要先将其映射到[0,1],变换为RGB颜色元素。法线向量从z轴方向也有向其他方向的偏差,颜色也就发生了轻微的变化。 阅读详情

OpenGL中启用光照前的准备——指定法线


     我们在使用光源时,除了强度和颜色之外,还需要指定光源的位置和方向,并且这些光源的位置和方向将会极大地影响场景的外观。

     OpenGL至少支持8种独立的光源。当我们指定一个光源时,便要告诉OpenGL这个光源的位置以及它的照射方向。光源经常向四周照射,但也可以向一个方向照射。无论在哪种情况下,对于我们所绘制的任何物体,来自任何光源的光线(除了纯粹的环境光源之外)都将根据一个角度撞击组成这个物体的多边形的表面。为了计算围绕多边形表面的着色效果,OpenGL必须能够计算光线与多边形表面之间的角度。

     设想一下,一个多边形被一束来自某个光源的光线所照射,当这束光线照射到多边形的表面时,它与平面会形成一个角度(A);然后,光线按照一个角度(B)向观察者反射(观察者不一定能够看到它)。通过这些角度,再加上我们之前所讨论的光照参数和材料属性,就可以计算这个位置的外观颜色了,如图所示

     

     由于OpenGL根据每个顶点计算外观颜色,那么当这每个顶点从某个角度被一束光线所照射时,我们该如何计算顶点和光线之间的角度呢?当然,我们无法用几何的方法找到3D空间中一个点和一条直线的角度,因为它存在无穷的可能性。为了解决这个问题,我们必须将每个顶点与一些信息相关联,这就是我们接下来要说的,表示每个顶点垂直向上的向量——法线。

     表面法线
     在一个假想的平面(或多边形)上,一条垂直向上的向量称为法线向量。实际上,它就是一条指向某个方向的直线(向量),它与多边形的表面呈90度角。

     

     指定法线
     在OpenGL中,下面这段代码指定了一条法线向量:
     
     glBegin(GL_TRIANGLES);
          glNormal3f(0.0f, -1.0f, 0.0f);
          glVertex3f(0.0f, 0.0f, 60.0f);
          glVertex3f(-15.0f, 0.0f, 30.0f);
          glVertex3f(15.0f, 0.0f, 30.0f);
     glEnd();

     glNormal3f函数接受3个表示坐标的值(X,Y,Z),它指定了一条垂直于这个三角形表面的法线向量。在这里,所有三个顶点的法线具有相同的方向,都是沿Y轴的负方向向下。这是一个简单的示例,因为这个三角形平平地躺在X-Z平面上。

     当我们开始绘图时,为每个顶点或多边形指定一条法线的任务几乎是不可能的,尤其是在只有很少一部分表面是平行于三个主平面的情况下。当然,我们会有解决的办法,可以通过调用一个glTools函数库中的方法,来生成我们所需要的法线。

     生成法线
     我们可以通过取多边形平面上的3个点来计算它的法线向量。如图所示,平面上的3个点P1、P2、P3,我们可以定义两个向量,从P1至p2的向量V1以及从P1至P3的向量V2。从数学的角度而言,三维空间中的两个向量定义了一个平面。我们对这两个向量求叉积(V1×V2),其结果所产生的向量与这个平面垂直,也就是我们所需的法线向量,如图中的向量V3所示:

     

     
     
     glTool函数库包含了一个函数,专门用于根据一个多边形上的3个点计算一条法线向量:

     void m3dFindNormal(M3DVector3f vNormal,
                         const M3DVector3f vP1,
                         const M3DVector3f vP2,
                         const M3DVector3f vP3);

     该方法的第一个参数用于存储求得的法线向量,还要另外向它传递3个向量,表示取自多边形或三角形上的点(以逆时针环绕方向指定)。注意,该方法返回的法线向量并不一定是单位长度的。

     单位法线
     所谓单位法线,就是长度为1的法线。将法线转换为单位法线的过程称为法线的规范化。在OpenGL的实现中,对于光照计算,所有的法线向量都必须先进行规范化,然后再参与计算。


    本文出自杜晓萌的博客,请勿用于任何商业用途,转载请保持完整性并标明出处:                    http://blog.youkuaiyun.com/haohan_meng



【OpenGL】LearnOpenGL学习笔记28 - 延迟渲染 Deferred Rendering LearnOpenGL学习笔记 - 延迟渲染 Deferred Rendering 阅读详情

相关推荐

基于QT与OpenGL的三维地球动态光照渲染实战

计算机图形学是研究如何在计算机中生成、处理和显示视觉内容的学科,其核心原理在于通过数学模型和算法将三维几何数据转换为二维屏幕图像。现代图形渲染管线,特别是可编程管线,允许开发者通过编写着色器程序精细控制光照、材质等视觉效果,这极大地提升了渲染的真实感和灵活性。其技术价值在于为游戏开发、科学可视化、地理信息系统(GIS)及虚拟现实等领域提供了强大的视觉表现基础。在GIS和科学可视化等应用场景中,动态、逼真的三维地球渲染是展示全球数据、模拟自然现象(如昼夜交替)的关键需求。本文聚焦于使用C++、QT和OpenG

weixin_33782386的博客 419

openGL中关于顶点的法线、切线、副切线

openGL系列文章目录 前言 我们在openGL中绘制球体,或者圆环体的时候,经常可以到法线、切线、副切线这几个词,一脸疑惑,特别是副切线,这时什么鬼? 一、法线(normal) 物体模型由成百上千个平坦的三角形围成.三角形上附加纹理的方式来增加额外细节. 提升真实感. 但是近看时,就有问题了.变成平面.缺乏细节.原因: 物体表面并非平坦的. 而是表示出无数(凹凸不平的)细节.如果以光的视角来看这个问题:是什么使表面被视为完全平坦的表面来照亮? 这时就需要法线 法线定义 三维平面的法线是垂直于该平面的三维

aoxuestudy的专栏 5918

OpenGL Shader:法线贴图实例编程

通过加载模型的法线贴图,我们可以在渲染过程中模拟出物体表面的微小细节,从而增强视觉效果。当然,实际应用中可能涉及更多的光照计算和材质属性,但这个示例代码可以作为一个入门点,让你开始使用法线贴图技术。首先,让我们了解一下法线贴图的基本原理。在本文中,我们将探讨如何在OpenGL着色器中实现法线贴图效果,并提供相应的源代码。在顶点着色器中,我们将模型的顶点位置、纹理坐标、法线和切线作为输入属性,并将它们传递给片段着色器。使用上述着色器,我们还需要加载模型的纹理和法线贴图,并将它们绑定到相应的纹理单元上。

DevRevolt的博客 176

OpenGL图形学开发中的“法线”

顶点通常是许多面共享的点,为了让光照看起来平滑,人们一般把这些面片的法线先算出来,然后对共享顶点上的这些面片法线求平均,再单位化。在曲面处(非平面多边形),每个顶点通常都有一个法线(vertex normal),这可以使光照看起来更平滑(Smooth shading)。通常再做单位化处理。(2) 通常我们使用单位法线(unit normal),也就是长度为1的向量,这样在后续光照计算中更方便(避免因长度不同引入误差)。对于隐式定义的曲面 F(x, y, z) = 0,则法线是梯度 ∇F(x, y, z)。

weixin_43638873的博客 411

OpenGL 视差贴图 Parallax Mapping

OpenGL 视差贴图 Parallax Mapping视差贴图 Parallax Mapping简介视差贴图陡峭视差映射视差遮蔽映射 视差贴图 Parallax Mapping简介 视差贴图(Parallax Mapping)技术和法线贴图差不多,但它有着不同的原则。和法线贴图一样视差贴图能够极大提升表面细节,使之具有深度感。它也是利用了视错觉,然而对深度有着更好的表达,与法线贴图一起用能够产生难以置信的效果。视差贴图和光照无关,我在这里是作为法线贴图的技术延续来讨论它的。需要注意的是在开始学习视差贴图之

希望我的博客,能帮上你解决学习中工作中所遇到的问题 908

python——模拟砍价

类型:随机数。

m0_62488776的博客 1971

【OpenGL】二十二、OpenGL 光照效果 ( 模型准备 | 光照设置 | 启用光照 | 启用光源 | 设置光源位置 | 设置光照参数 | 设置环境光 | 设置反射材质 | 设置法线 )

一、模型准备、 二、光照设置、 1、启用光照设置、 2、启用光源、 3、设置光照参数、 4、设置环境光、 5、设置反射材质、 三、光照法线设置、 1、设置光源位置、 2、设置法线、 3、代码示例及运行效果、 四、相关资源、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 4203

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​是预先固定的汇率. 假设上述股票均遵循几何布朗运动,可以得到以下恒等式

qq_41782124的博客 3683

OpenGL生成的法线贴图并增加光照

这一篇将由OpenGL生成法线贴图的基础上再增加光照效果。 思路如下: 准备一张墙壁图片A。 通过A自动生成法线贴图。 设计一个平行光,指定平行光的光照颜色和光照方向。 使用漫反射光照公式,法线贴图和光照方向进行点乘。 计算出光照渲染出的高光部分和阴影部分,和A进行乘法操作。 原图如下: 首先验证是否生成法线贴图,代码如下: #iChannel0"file://./wall.jpeg" f...

qq_37340753的博客 553

PCB布局布线要求及多层电路板叠加原则

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考本文主要针对PCB布局布线中的要点进行了总结,并对多层电路板的叠加原则进行了解释。

Ka_wyb的博客 2939

为什么你的SSE连接总断?深入对比EventSource与fetch-event-source的5大差异点

本文深入对比了原生EventSource与@microsoft/fetch-event-source库在SSE连接稳定性上的五大关键差异。重点剖析了后者在请求能力、连接控制、错误处理、数据解析及性能优化方面的优势,特别是其支持POST请求、自定义Header、精细化的重连策略与生命周期管理,为解决生产环境中SSE连接频繁断开的问题提供了专业方案。

weixin_28077113的博客 494

OpenGL 光照

OpenGL 中实现光照的基本原理是Phong 光照模型,它将光照分解为环境光、漫反射光和镜面光三部分。实现的关键在于:提供正确的法线数据在世界空间中进行所有光照计算(需要正确变换顶点位置和法线)在片段着色器中为每个像素执行光照计算通过Uniform变量将光源、材质和摄像机属性传递给着色器。

w2064004678的博客 955

Sony DPT RP1/CP1破解攻略

前言 自己有一台Sony DPT CP1和一台kindle,两个都已经用了很多年。直到最近发现微信读书上经常可以找到一些免费而且不错的书,所以就萌生了在两台机器上使用微信读书的想法。kindle比较容易实现,直接打开内置浏览器,进入微信读书网页版就行了,而Sony的电纸书则只能通过破解+安装微信读书的方式实现。大概弄了两三个小时吧,也遇到了一些问题,所以这里记录一下整个过程,希望能方便后来的使用者。 首先感谢HappyZ, osc_t5nbj8ds。前者是提供公开破解的方法的大神,后者则是解决了我遇到的问题

weixin_43467572的博客 1万+

【OpenGL】openGL 法线贴图

本文介绍了法线贴图的核心原理与实现方法。法线贴图通过RGB值存储表面法线信息(0-1映射到-1-1),其蓝色调源于法线通常指向曲面外侧。关键难点在于将切线空间法线转换到模型空间,这需要构建由切线(T)、副切线(B)和法线(N)组成的TBN矩阵。文章详细推导了通过三角形边和UV差值计算切线与副切线的数学过程,并提供了C++实现代码。在着色器实现部分,需新增切线和副切线缓冲区,通过TBN矩阵的转置完成空间转换。文末给出了完整的绘制代码框架,包括缓冲区创建、纹理加载和矩阵计算等关键步骤。

Antonio915的博客 928

解析 RABAX during SAPGUI Logon 错误及其解决方案

登录用户关联了初始启动程序,该程序由于未处理的异常导致运行时错误。在 ST22 查看错误的程序名和错误行。修复初始程序代码中的逻辑问题。重新部署修复后的代码。示例代码:防止未处理的异常TRY." 模拟逻辑处理ENDTRY.此代码通过 TRY-CATCH 块捕获潜在错误,避免程序崩溃。是 SAP 系统中常见的运行时错误,其根源可能涉及多个方面,包括用户配置、系统状态、数据库连接和自定义开发等。通过结合 ST22、SM21 等诊断工具,以及完善的代码实践和系统监控,可以有效预防和解决此类问题。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1781

学 Simulink—— 基于高频方波电压注入的表贴式永磁电机无感控制仿真

本文手把手教授基于Simulink的高频方波电压注入法实现表贴式永磁同步电机(SPMSM)无传感器控制。针对表贴式电机微弱凸极特性(Lq/Ld≈1.05-1.15),详解方波注入相比正弦注入的优势:通过5kHz方波(PWM频率半值)集中能量提升信噪比,并采用相邻周期电流直接相减的零延迟分离技术。系统架构包含高频注入器、无滤波器信号分离模块、锁相环观测器和磁饱和极性辨识等关键环节,提供参数设置经验(如注入幅值10-15%Vdc)和典型性能指标(位置误差<0.2rad)。特别强调工程实现要点:PWM同步时

xiaoheshang_123的博客 168

【OpenGL】openGL 基本着色

本文介绍了OpenGL中基础光照模型的实现。首先讲解了法线向量的概念,包括三角形法线和顶点法线的计算方法,以及在OpenGL中的使用方式。接着重点阐述了漫反射光照分量的原理,通过计算光线与表面法线的夹角来模拟光强变化,并加入了材质颜色和光源强度的影响。随后引入环境光分量来模拟间接光照效果。最后简要提及镜面反射分量,为后续高级着色技术做铺垫。教程通过伪代码和渲染效果图展示了不同光照分量的实现方法和视觉效果,为初学者构建了基本的光照模型框架。

Antonio915的博客 1342

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基座安装后无法打开问题,真机运行时检测不到手机的问题或者基座安

✅ 精选推荐文章 1万+

OpenGL入门:手把手教你实现3D光照效果(含完整代码解析)

作为一名OpenGL小白,当我第一次看到光照相关的代码时,整个人是懵的——为什么要多出那么多顶点数据?那个小方块是什么?法线又是干什么用的?如果你也有同样的困惑,这篇文章就是为你准备的。我将通过一个完整的示例,带你逐行理解OpenGL中基本光照的实现。最终效果:一个受光照影响的彩色立方体 + 一个表示光源位置的小方块,支持摄像机移动。

2603_95645917的博客 962

复分析 阿尔福斯(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。 现实生活中我们看到某一物体的颜色并不是物体真正的颜色...

qq_29639589的博客 907

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

IC-Light:2D原画还在手绘法线贴图?快速单张平涂秒接Unity实时动态光照

今天分享这套极度冷门却异常硬核的“2D 动态光照法线速通术”,专为被“引擎动态光”折磨的 2D 原画师与技术美术(TA)打造。

海外旅居设计师,15年设计经验。 1540

深度学习工具包 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');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](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维的物体,本...

加载中... 2404

OpenGL冯氏光照模型实现:从原理到C++/GLSL代码实战

在计算机图形学中,光照模型是模拟光线与物体表面交互、生成真实感3D图像的核心技术。其基本原理是通过数学公式计算光线在物体表面的反射、折射等行为,从而模拟出环境光、漫反射和镜面反射等视觉效果。这项技术的价值在于,它能让二维屏幕上的几何模型呈现出立体感、质感和空间关系,是游戏开发、虚拟现实、建筑可视化等领域的基石。冯氏光照模型作为一种经典且高效的模型,将复杂的光照计算分解为环境光、漫反射和镜面反射三个可独立控制的分量,平衡了视觉效果与计算性能。在OpenGL等图形API的工程实践中,实现光照涉及顶点与片段着色器

weixin_33853794的博客 373

OpenGL高级光照系统完全指南:环境光、镜面光与高光效果实现

OpenGL高级光照系统是创建逼真3D图形的核心技术,它通过环境光、镜面光和高光效果模拟真实世界的光照行为。💡 在opengl-series项目中,Thomas Dalling提供了一套完整的现代OpenGL光照实现方案,帮助开发者掌握专业级的光照渲染技术。 ## 🌟 高级光照系统核心概念 OpenGL高级光照系统基于Phong光照模型,通过三种主要光照分量来模拟真实光照效果: ###

gitblog_00087的博客 1208

[OpenGL] opengl切线空间

对于法线贴图来说,我们知道它就是一个2D的颜色纹理,根据rgb来映射法线对应的xyz,从而达到在同一个平面上有多个不同方向法线的效果,这样就能根据光照的计算结果不同,从而得到凹凸不平(或者说更加细节)的平面。

qq_45280097的博客 1056

现代OpenGL光照模型实现:Phong光照、环境光与镜面反射完全指南

OpenGL作为图形渲染的行业标准,其光照系统是创建真实感3D场景的核心。本文将通过实例详解Phong光照模型的实现原理,帮助开发者掌握环境光、漫反射和镜面反射的计算方法,打造出具有专业视觉效果的3D应用。 ## Phong光照模型基础:三大核心组件 Phong光照模型通过叠加三种不同类型的光来模拟真实世界的光照效果,这三种光分别是环境光、漫反射光和镜面反射光。该模型由计算机图形学先驱Bui

gitblog_00098的博客 646
上一篇: 在OpenGL中给场景添加光照
下一篇: OpenGL中设置光照的镜面反射效果
杜晓萌
博客等级 码龄16年 221粉丝 70原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值