本章我们来研究应用程序构建相关的标准库,包括用于命令行参数解析的 flag 包,简单的日志记录包 log(以及 syslog),公共变量标准接口 expvar 包,以及运行时的调试工具 runtime/debug 包。
到目前为止我们实现的延迟渲染效果还算不错,但是当你将相机靠近物体观察时会出现在上一课的结尾提到的问题。第一个问题就是由于背面剔除的存在,当相机进入到光源体之后这个光源的光照效果就会消失。第二个问题则与光源的范围有关,这是因为在将光源的包围球投影到屏幕坐标系之后,我们会对被这个球体覆盖的所有像素都进行光照计算,即使这个像素离光源很远(也就是位于光源体之外)。 OpenGL 中的模板缓存可以帮助我们解
在前面的课程中我们学习了延迟渲染的基础部分,而且将几何阶段的结果输出到了 G-Buffer 中。如果你运行了演示程序你就知道 G-Buffer 里面的内容是什么了。今天我们将完成延迟渲染的基本实现,并且使得最后渲染出来的场景看起来和使用正向渲染的结果一样!在这一课的最后会有一个问题显现出来,这个问题将在下一课中解决。 现在 G-buffer 中已经存放和合适的数据,我们要借助于它们来进行光照计算。
从第十七课起到目前为止,我们所做的光照计算都叫做前向渲染(着色),这是一个十分直接的方式,我们在 VS 中对所有对象的顶点进行一系列的变换(这些变换通常是将顶点法线和顶点位置变换到裁剪空间中),之后在 FS 中逐像素进行光照计算。由于每个像素都只调用 FS 一次,所以当我们逐像素的计算每个像素的光照效果时,我们需要将所有的光照信息都传递到 FS 中。这个方法十分简单但是却有一些缺陷,如果场景十分复
在前面一节中我们学习了 shadow mapping 的基本原理,并且介绍了如何将深度信息渲染到一张纹理上面并最终通过从深度缓存中进行采样而将其渲染到屏幕上面。在这一节中我们将会介绍如何使用这个功能来创建真正的阴影。 我们知道 shadow mapping 是一个二次渲染技术,在第一次渲染过程中场景的渲染是从光源角度出发的。让我们回顾一下在第一次渲染时位置向量的 Z 分量的发生了什么: 传入顶点着
阴影和光是紧密联系在一起的,因为如果你想要产生一个阴影就必须要光。有许多的技术可以生成阴影,在接下来的两个章节中我们将学习其中的一种比较基础简单的技术-阴影贴图。 当光栅化的时候,你会问这个像素是否位于阴影中?让我们换个问法,从光源到像素的路径是否中间经过其他物体?如果是,这个像素可能位于阴影中(假定其他的物体不透明),如果不是,则像素不位于阴影中。某种程度上这个问题和我们之前章节问的问题相似,如
本章将会介绍如何创建Python程序的图形用户界面(GUI),也就是那些带有按钮和文本框的窗口等。很酷吧? 目前支持Python的所谓“GUI工具包”(GUI Toolkit)有很多,但是没有一个被认为是标注你的GUI工具包。这样的情况也好(自由选择的空间较大)也不好(其他人没法用程序,除非他们也安装了相同的GUI工具包),幸好Python的GUI工具包之间没有冲突,想装多少个就可以装多少个。 本
本节重点: 控制滚动条到底部 有时候我们需要控制页面滚动条上的滚动条,但滚动条并非页面上的元素,这个时候就需要借助js是来进行操作。一般用到操作滚动条的会两个场景: 注册时的法律条文需要阅读,判断用户是否阅读的标准是:滚动条是否拉到最下方。 要操作的页面元素不在吸视范围,无法进行操作,需要拖动滚动条 其实,实现这个功能只要一行代码,但由于不懂js ,所以花了不小力气找到这种方法。 用于标识滚动条位
本节重点: l 键盘按键用法 l 键盘组合键用法 l send_keys() 输入中文运行报错问题 键盘按键键用法: #coding=utf-8from selenium import webdriverfrom selenium.webdriver.common.keys import Keys #需要引入keys包import os,time driver = webdriver.Fire
写下本系列文章的初衷是为了帮助更多 Android 的初学者可以尽快的进入角色,通过编写一些简单可行的代码,可以大大增加自己的兴趣和信心,同时也会加深对Android的学习和理解。做技术,就是要动手、要实战。文章中提供了较为详细的源码,大家可以写看一遍,理解后自己动手,这样可以快速入门 Android 开发。希望大家都能通过本系列文章得到提升。 为了更好的理解和学习本书,我希望你具有如下知识: J
前两章――动态数据模式与表数据网关模式各自展示对记录与每个表进行抽象的策略。这些模式都很有用,但每一个模式的执行都与底层的数据库结构结合过于紧密,因此基于以上模式的解决方案就存在一定的问题。比如,你的代码用字段名作为数组的关键字或是行数据对象的属性,则你的应用就受到数据库结构的约束,并且每当表结构发生哪怕是很小的变化,你都不得不在你的PHP程序中做大量的修改。 因为代码与数据库结构在开发过程经常变
到目前为止,您所看到的这些设计模式大大提高了代码的可读性与可维护性。然而,在WEB应用设计与开发中一个基本的需求与挑战:数据库应用,这些设计模式都没有涉及到。本章与接下来的两章—表数据网关与表数据映射,提供了三种设计模式使您能更好的组织你的应用程序与数据库进行交互。 问题 大多数WEB应用将信息持续保存在数据库中。有将数据库操作抽象化,以达到简化表数据存取和对业务逻辑的集成存取方法吗? 解决方案
上一讲介绍了用WebView来抓取一个网页内容。这一讲我将介绍如何在安卓内部直接进行HTTP通信。 《亚当的诞生》,西斯廷礼拜堂的吊顶画,米开朗基罗之作。当时的教皇强迫沉迷于雕塑的米开朗基罗画巨幅壁画。米开朗基罗认为这是在浪费自己的才华,充满愤怒的作画。当然,他又成功了。 描述 这一讲中,我将使用JSON,将数据库备份到远程的数据库中。反过来我也将从远程数据库中抓取条目,并放入安卓的数据库。相关的
终于又到了写着一篇的时候了,从去年(2013)8月份决定再更新一版Backbonejs入门教程。原因在前言中已经介绍过了,主要是填一些坑。 看看上一版的那个总结 16、总结的说 的时间------2012.4.18。再看看这一篇的时间------2014.4.15,差不多刚好两年的时间。之前的状态是刚接触前端框架方面的东西,像是在迷雾中行走,摸摸探探的总算知道这是条什么样的路。 现在的这一本更多的
忘了之前定这么个题目是要表达什么内容,就简单介绍下wechat项目中的错误处理。 16.1 error的使用 说这个错误处理其实很简单,有过JavaScript经验的同学应该看到Backbonejs中定义的回调函数选项中的error参数就知道怎么写了。 需要处理错误的场景都是在客户端和服务器端通信时,在wechat中主要是save和fetch时。有一段代码展示下就是: registe: funct