- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用 GLSL 使阴影贴图工作。不幸的是,即使我有相当不错的深度缓冲精度,我的深度渲染结果也无法使用。它像线框一样渲染,下图可能是更好的描述。
我还包括一个测试用例(包含着色器的单个文件),唯一的依赖项是 pyopengl。
# shadow mapping test
# utkualtinkaya at gmail
# shader is from http://www.fabiensanglard.net/shadowmapping/index.php
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
from OpenGL.GL.shaders import *
from OpenGL.GL.framebufferobjects import *
import math
class Camera:
def __init__(self):
self.rotx, self.roty = math.pi/4, math.pi/4
self.distance = 100
self.moving = False
self.ex, self.ey = 0, 0
self.size = (800, 600)
def load_matrices(self):
glViewport(0, 0, *self.size)
y = math.cos(self.roty) * self.distance
x = math.sin(self.roty) * math.cos(self.rotx) * self.distance
z = math.sin(self.roty) * math.sin(self.rotx) * self.distance
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(45.0, self.size[0]/float(self.size[1]), 1, 1000)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
gluLookAt(x,y,z, 0,0,0, 0,1,0)
def on_mouse_button (self, b, s, x, y):
self.moving = not s
self.ex, self.ey = x, y
if b in [3, 4]:
dz = (1 if b == 3 else -1)
self.distance += self.distance/15.0 * dz;
def on_mouse_move(self, x, y, z = 0):
if self.moving:
self.rotx += (x-self.ex) / 300.0
self.roty += -(y-self.ey) / 300.0
self.ex, self.ey = x, y
def set_size(self, w, h):
self.size = w, h
class Shader():
def __init__(self):
self.is_built = False
self.uniforms = {}
def build(self):
self.program = compileProgram(
compileShader('''
uniform mat4 camMatrix;
uniform mat4 shadowMatrix;
varying vec4 depthProjection;
uniform bool useShadow;
void main() {
gl_Position = camMatrix * gl_ModelViewMatrix * gl_Vertex;
depthProjection = shadowMatrix * gl_ModelViewMatrix * gl_Vertex;
gl_FrontColor = gl_Color;
}
''',GL_VERTEX_SHADER),
compileShader('''
varying vec4 depthProjection;
uniform sampler2D shadowMap;
uniform bool useShadow;
void main () {
float shadow = 1.0;
if (useShadow) {
vec4 shadowCoord = depthProjection / depthProjection.w ;
// shadowCoord.z -= 0.0003;
float distanceFromLight = texture2D(shadowMap, shadowCoord.st).z;
if (depthProjection .w > 0.0)
shadow = distanceFromLight < shadowCoord.z ? 0.5 : 1.0 ;
}
gl_FragColor = shadow * gl_Color;
}
''',GL_FRAGMENT_SHADER),)
self.is_built = True
self.uniforms['camMatrix'] = glGetUniformLocation(self.program, 'camMatrix')
self.uniforms['shadowMatrix'] = glGetUniformLocation(self.program, 'shadowMatrix')
self.uniforms['shadowMap'] = glGetUniformLocation(self.program, 'shadowMap')
self.uniforms['useShadow'] = glGetUniformLocation(self.program, 'useShadow')
print self.uniforms
def use(self):
if not self.is_built:
self.build()
glUseProgram(self.program)
class Test:
def __init__(self):
glutInit(sys.argv)
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_ALPHA | GLUT_DEPTH)
glutInitWindowSize(800, 600)
glutInitWindowPosition(1120/2, 100)
self.window = glutCreateWindow("Shadow Test")
self.cam = Camera()
self.light = Camera()
self.cam.set_size(800, 600)
self.light.set_size(2048, 2048)
self.light.distance = 100
self.shader = Shader()
self.initialized = False
def setup(self):
self.initialized = True
glClearColor(0,0,0,1.0);
glDepthFunc(GL_LESS)
glEnable(GL_DEPTH_TEST)
self.fbo = glGenFramebuffers(1);
self.shadowTexture = glGenTextures(1)
glBindFramebuffer(GL_FRAMEBUFFER, self.fbo)
w, h = self.light.size
glActiveTexture(GL_TEXTURE5)
glBindTexture(GL_TEXTURE_2D, self.shadowTexture)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
glTexImage2D( GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, w, h, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, None)
glDrawBuffer(GL_NONE)
glReadBuffer(GL_NONE)
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, self.fbo, 0)
FBOstatus = glCheckFramebufferStatus(GL_FRAMEBUFFER)
if FBOstatus != GL_FRAMEBUFFER_COMPLETE:
print ("GL_FRAMEBUFFER_COMPLETE_EXT failed, CANNOT use FBO\n");
glBindFramebuffer(GL_FRAMEBUFFER, 0)
#glActiveTexture(GL_TEXTURE0)
def draw(self):
glPushMatrix()
glTranslate(0, 10 ,0)
glColor4f(0, 1, 1, 1)
glutSolidCube(5)
glPopMatrix()
glPushMatrix()
glColor4f(0.5, 0.5, .5, 1)
glScale(100, 1, 100)
glutSolidCube(1)
glPopMatrix()
def apply_camera(self, cam):
cam.load_matrices()
model_view = glGetDoublev(GL_MODELVIEW_MATRIX);
projection = glGetDoublev(GL_PROJECTION_MATRIX);
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
glMultMatrixd(projection)
glMultMatrixd(model_view)
glUniformMatrix4fv(self.shader.uniforms['camMatrix'], 1, False, glGetFloatv(GL_MODELVIEW_MATRIX))
glLoadIdentity()
def shadow_pass(self):
glUniform1i(self.shader.uniforms['useShadow'], 0)
glBindFramebuffer(GL_FRAMEBUFFER, self.fbo)
glClear(GL_DEPTH_BUFFER_BIT)
glCullFace(GL_FRONT)
self.apply_camera(self.light)
self.draw()
glBindFramebuffer(GL_FRAMEBUFFER, 0)
def final_pass(self):
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
self.light.load_matrices()
model_view = glGetDoublev(GL_MODELVIEW_MATRIX);
projection = glGetDoublev(GL_PROJECTION_MATRIX);
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
bias = [ 0.5, 0.0, 0.0, 0.0,
0.0, 0.5, 0.0, 0.0,
0.0, 0.0, 0.5, 0.0,
0.5, 0.5, 0.5, 1.0]
glLoadMatrixd(bias)
glMultMatrixd(projection)
glMultMatrixd(model_view)
glUniformMatrix4fv(self.shader.uniforms['shadowMatrix'], 1, False, glGetFloatv(GL_MODELVIEW_MATRIX))
glActiveTexture(GL_TEXTURE5)
glBindTexture(GL_TEXTURE_2D, self.shadowTexture)
glUniform1i(self.shader.uniforms['shadowMap'], 5)
glUniform1i(self.shader.uniforms['useShadow'], 1);
self.apply_camera(self.cam)
glLoadIdentity()
glCullFace(GL_BACK)
self.draw()
def render(self):
if not self.initialized: self.setup()
self.shader.use()
self.shadow_pass()
self.final_pass()
glutSwapBuffers()
def mouse_move(self, *args):
self.cam.on_mouse_move(*args)
self.light.on_mouse_move(*args)
def mouse_button(self, b, *args):
if b==0:
self.light.on_mouse_button(b, *args)
else:
self.cam.on_mouse_button(b, *args)
def main(self):
glutDisplayFunc(self.render)
glutIdleFunc(self.render)
glutMouseFunc(self.mouse_button)
glutMotionFunc(self.mouse_move)
glutReshapeFunc(self.cam.set_size)
#self.setup()
glutMainLoop()
if __name__ == '__main__':
test = Test()
test.main()
最佳答案
解决了,这是绑定(bind)问题,在阴影 channel 片段着色器中,我只是检查了一个 bool 值以禁用读取纹理,但这还不够。我应该在阴影传递之前取消绑定(bind)纹理,这在文档中提到为:
引自 OpenGL 引用资料:需要采取特殊的预防措施,以避免在纹理对象当前绑定(bind)并可能被当前顶点或片段着色器采样时将纹理图像附加到当前绑定(bind)的帧缓冲区。
NVIDIA 忽略了这一点,ATI 的行为几乎如文档所述“未定义”。
关于python - 使用 GLSL 的 OpenGL 阴影贴图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4484605/
每当我尝试使用 AndroidStudio 生成一个新的 Android 项目时,它总是隐藏文件夹“drawables”。这以前从未发生在我身上。我环顾四周,发现它生成了这个名为“mipmap”的文件
因此,我试图使 native map 在EXPO应用程序中工作,文档页面显示“在EXPO应用程序中无需使用设置” https://docs.expo.io/versions/latest/sdk/ma
摘要 我正在尝试将位移贴图(高度贴图)应用于一个相当简单的对象(六角形平面),并且得到了一些意想不到的结果。我使用的是灰度,因此,我的印象是我的高度图应该只影响网格的 Z 值。然而,我创建的置换贴图在
我目前正在对three.js 进行一些试验,我想使用自发光贴图。我曾尝试将纹理加载到 phong Material 的自发光属性中,但不幸的是,它并没有像那样工作。这是我的代码: var params
我是地理编码方面的新手,所以我希望你能给我一些提示,告诉我如何获得以下内容: 我想用 D3 或传单制作一张 map ,上面有一些标记。如果单击标记,信息应弹出/显示在 map 旁边。有点像这个例子:h
我正在使用jvector maps客户网站上的 map ,他们知道希望我将其转换为 Concrete5,以便他们可以自行编辑。一切都很顺利,直到我尝试重新创建我使用 jVector map 的页面。当
这会导致疯狂的编译时间:~20 秒。请注意,它创建了 global-s9e3ed7fd2e.png 图像 5 次,而不是移动设备一次和桌面一次。 我只看到 @import "sprites/globa
我想创建一个 STL map 来查找一个项目是否足够接近 3 维空间中的另一个项目。到目前为止,我的“less-than-functor”工作得很好,粘贴到以下链接。 现在这个问题不完全是“最近邻”问
在初始化 map 时直接给出标记和多边形似乎可以工作,但是在调用 setState 方法时不会添加多边形和标记。 我不知道我似乎错过了什么, 以下是我迄今为止尝试过的。 有人可以帮助解决我所缺少的 m
我想弄清楚如何在盒子的正面和背面使用两种不同的纹理。每当我缩放我的盒子 (ExtrudeGeometry) 时,UV 贴图似乎都没有更新。因此,我为盒子的正面和背面定义了自己的 UV 贴图。 要定义我
我正在尝试正确映射 UV 纹理,但失败了... 我的应用程序中有下一个结果: 结果不是我在等待。我想要下一个描述的 View : 源代码在这里: http://pastebin.com/aDg981B
我正在尝试创建一个 Material 对话框以使用 AGM( Angular 谷歌地图)捕获用户位置。我的主页上有一个工作示例,但是当对话框打开时,它只会在 map 应该显示的位置显示一个空白区域。当
尝试将 UV 坐标映射到球体时遇到以下问题 这是我用来获取 UV 坐标的代码 glm::vec2 calcUV( glm::vec3 p) { p = glm::normalize(p);
我需要找到一种方法来解决在不使用设计工具的情况下为非凸多面体生成纹理贴图的问题。具体来说,我将模拟结果数据映射到 3D 表面上。也就是说,在代码中(最好是 C# 或 VB,因为我的目标是 WPF 3D
尝试添加 infoWindows 时,我收到 Unable to get gMarker frommarkerScope! (在 Angular map 中: https://github.com/a
这是一个非常简单的 Three.JS 草图,生成以下渲染: 正如您可能看到的,这个 THREE.BufferGeometry 是一个 8x8 矩阵,通过以这种方式设置 UV: for(var i =
我在使用 UV 贴图渲染 3D 对象时遇到问题。 首先,我的对象在 Wavefront 模型中。我使用一个解析器将整个文件拆分为顶点、法线、面和纹理坐标。解析 file.obj 后,我拥有了所有这些。
在 RStudio 中使用传单会在查看器中生成空白 map 。只能看到标记。在控制台中看不到任何警告或错误消息。当我使用 shiny 时,它在 RStudio 查看器中是一样的,但可以通过在 shin
在互联网上多次搜索后我找不到答案.. 情况如何?我是(比利时)大学计算机科学专业的学生,我必须使用图形库 LibGdx 用 Java 制作塔防。 问题是什么?在LibGdx中,有一个名为“Ti
如何将多个参数传递给通过 pool.map 调用的函数? 我的代码: import gevent from gevent.pool import Pool def process(param1, pa
我是一名优秀的程序员,十分优秀!