小编Nic*_*vre的帖子

基本的openGL,顶点缓冲区和pyglet

编辑:rotoglup在我的代码中发现了问题,添加了我删除的着色器完成了解决方案.请参阅下面的答案以获取正确的代码(使用着色器).

大家好 !

我正在尝试从本教程中学习一些现代OpenGL的基础知识.

我想用python/pyglet而不是C++来做.我知道pyglet可以抽取大部分低级OpenGL; 我想先了解一些基础知识,然后再将它们隐藏在抽象层之后.

我的问题非常简单:下面的代码只绘制一个点而不是我期望的3个点.据我所知,我的代码与教程中的C++相同,除了删除顶点和片段着色器(通过python中的gletools完成),这似乎对我的问题没有任何影响.

将事物简化为单点显示我不理解的行为(第一个坐标似乎是唯一影响任何事物的坐标),这让我回想起我完全不理解pyglet,OpenGL,或者甚至是一般的3D:p

这是相关的代码:

import pyglet
from pyglet.gl import *

window = pyglet.window.Window()

positionBufferObject = GLuint()
vao = GLuint()

vertexPositions = [0.0, 0.0, 0.0,
                   0.25, 0.0, 0.0,
                   1.75, 1.75, 0.0]

vertexPositionsGl = (GLfloat * len(vertexPositions))(*vertexPositions)

@window.event
def on_draw():
    glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject)
    glEnableVertexAttribArray(0)
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0)
    glDrawArrays(GL_POINTS, 0, 3)
    glDisableVertexAttribArray(0)

glGenBuffers(1, positionBufferObject)
glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject)
glBufferData(GL_ARRAY_BUFFER, len(vertexPositionsGl)*4, vertexPositionsGl, GL_STATIC_DRAW)
glBindBuffer(GL_ARRAY_BUFFER, 0)

glClearColor(0.0, 0.0, 0.0, 0.0)
pyglet.app.run()
Run Code Online (Sandbox Code Playgroud)

python opengl pyglet

6
推荐指数
2
解决办法
4855
查看次数

HDR,自适应色调映射和GLSL中的MSAA

为了自学OpenGL,我正在通过第五版的Superbible工作.

我目前正在试图弄清楚如何结合HDR和MSAA(如第9章所述).

对于HDR,本书提出了一种自适应色调映射方法,该方法基于计算每个片段的5x5卷积滤波器的平均亮度.

对于MSAA,使用的方法通过从样本距离计算的权重来平均所有样本.

我尝试将两者结合起来,在下面的pastebin中,将色调映射应用于每个样本,然后平均它们以计算最终的片段颜色.

性能是(正如人们应该预期的那样?)可怕:每个样本25个查找,4xMSAA为4次,我猜测GPU花费大部分时间来查找我的FBO纹理.切换到代码中由use_HDR统一控制的代码路径,对于简单的场景,性能会下降400 + fps到10以下.

我的问题是双重的:

  • 这是一种执行色调映射的理智方法吗?如果没有,你会建议什么?

  • MSAA和基于卷积的过滤器应该如何组合?我猜我会再次遇到这个问题需要查找相邻纹素的任何滤镜,即几乎任何像绽放,模糊等等?

码:

#version 330
in Data
{
    vec4 position;
    vec4 normal;
    vec4 color;
    vec2 texCoord;
    mat4 mvp;
    mat4 mv;
} gdata;

out vec4 outputColor;
uniform sampler2DMS tex;
uniform sampler1D lum_to_exposure;
uniform samplerBuffer weights;
uniform int samplecount;
uniform bool use_HDR;

vec4 tone_map(vec4 color, float exp)
{
    return 1.0f - exp2(-color * exp);
}

const ivec2 tc_offset[25] = ivec2[](ivec2(-2, -2), ivec2(-1, -2), ivec2(0, -2), ivec2(1, -2), ivec2(2, -2),
                                    ivec2(-2, -1), …
Run Code Online (Sandbox Code Playgroud)

opengl glsl

6
推荐指数
1
解决办法
8960
查看次数

WinDbg可以看到的模块数量是否有上限?

有谁知道WinDbg可以看到的DLL数量是否有上限?我相信Visual Studio曾被限制在500,但我无法在工作的某些二手账户之外找到这种索赔的来源.

我正在尝试调试一个毛茸茸的场景,而WinDbg的堆栈跟踪是不完整的.根据Process Explorer,我感兴趣的模块已加载但它没有显示在WinDbg的'lm'输出中.

可疑的是,输出正好是500个模块长,即使我知道还有很多比加载,导致我相信WinDbg没有看到超过前500的DLL.任何人都可以确认?或者提出一些其他原因,为什么加载的模块可能不会出现在'lm'中?


编辑:经过进一步的调查,我能够在加载该模块之前,通过更早地附加调试器来加载WinDbg以查看我需要的模块.

在我看来,在附加到进程后,调试器引擎只会看到前500个dll,但会正确处理后续加载.我仍然喜欢WinDbg专家的确认,或者更好的是,在附加时绕过处理超过500个模块!

debugging windbg

5
推荐指数
2
解决办法
533
查看次数

simple procedural skybox

As part of an attempt to generate a very simple looking sky, I've created a skybox (basically a cube going from (-1, -1, -1) to (1, 1, 1), which is drawn after all of my geometry and forced to the back via the following simple vertex shader :

#version 330
layout(location = 0) in vec4 position;
layout(location = 1) in vec4 normal;

out Data
{
    vec4 eyespace_position;
    vec4 eyespace_normal;
    vec4 worldspace_position;
    vec4 raw_position;
} vtx_data;

uniform mat4 model;
uniform mat4 …
Run Code Online (Sandbox Code Playgroud)

opengl glsl

5
推荐指数
1
解决办法
1873
查看次数

标签 统计

opengl ×3

glsl ×2

debugging ×1

pyglet ×1

python ×1

windbg ×1