小编Fla*_*lau的帖子

OpenGL中的Oren-Nayar照明(如何计算片段着色器中的视图方向)

我试图实现奥伦-纳亚尔照明在片段着色器如图所示这里.

但是,我在地形上得到了一些奇怪的灯光效果,如下图所示.

我目前正在向着色器发送"查看方向"制服作为相机的"前"向量.我不确定这是否正确,因为移动相机会改变工件.

将"前"矢量乘以MVP矩阵可以得到更好的结果,但是从某些角度观察地形时,人工制品仍然非常值得注意.在黑暗区域和屏幕边缘尤其明显.

什么可能导致这种影响?

神器的例子

在此输入图像描述

场景应该如何

在此输入图像描述

顶点着色器

#version 450

layout(location = 0) in vec3 position;
layout(location = 1) in vec3 normal;

out VS_OUT {
    vec3 normal;
} vert_out;

void main() {
    vert_out.normal = normal;
    gl_Position = vec4(position, 1.0);
}
Run Code Online (Sandbox Code Playgroud)

Tesselation控制着色器

#version 450

layout(vertices = 3) out;

in VS_OUT {
    vec3 normal;
} tesc_in[];

out TESC_OUT {
    vec3 normal;
} tesc_out[];

void main() { 
    if(gl_InvocationID == 0) {
        gl_TessLevelInner[0] = 1.0;
        gl_TessLevelInner[1] = 1.0;

        gl_TessLevelOuter[0] = 1.0;
        gl_TessLevelOuter[1] …
Run Code Online (Sandbox Code Playgroud)

c++ opengl lighting glsl

11
推荐指数
1
解决办法
849
查看次数

在Python中初始化大量布尔值

可能重复:
使用相同的bool值初始化列表

我正在尝试在python 2.7中创建一个素数生成器,并计划使用布尔数组(或列表)来指示给定数字是否为素数.

假设我想初始化5000个布尔值的列表,如何在不必手动输入的情况下这样做 [True, True, ...]

python boolean list

8
推荐指数
1
解决办法
3万
查看次数

OpenGL阴影peter-panning

我通过两个绘制过程向一个场景添加阴影,一个是深度图,另一个是普通帧缓冲.

使用深度图时不使用偏差,会有很多阴影痤疮.

阴影痤疮没有偏见

通过向深度图检查添加偏差来解决此问题.

阴影与偏见

但是,当光线移动到不同的角度时,这会导致阴影从对象"分离".

彼得平移

我相信这种效应被称为peter-panning,是由于不同角度使用更大的偏差造成的.

通常的解决方法似乎是在绘制阴影贴图时剔除三角形,但是由于地板平面是2D对象,我不相信这会正常工作.

我正在使用的实际地形是程序生成的,因此创建它的3D版本并不像在这个简单示例中那样简单.

如何将peter-panning固定在这样的2D物体上?


顶点着色器

#version 400

layout(location = 0) in vec3 position;
layout(location = 1) in vec3 normal;
layout(location = 2) in vec2 texture_coords;

out VS_OUT {
    vec4 position;
    vec3 normal;
    vec2 texture_coords;
    vec4 shadow_position;
} vs_out;

uniform mat4 model;
uniform mat4 model_view;
uniform mat4 model_view_perspective;
uniform mat3 normal_matrix;
uniform mat4 depth_matrix;

void main() {
    vec4 position_v4 = vec4(position, 1.0);

    vs_out.position = model_view * position_v4;
    vs_out.normal = normal_matrix * normal;
    vs_out.texture_coords = texture_coords;
    vs_out.shadow_position = …
Run Code Online (Sandbox Code Playgroud)

c++ opengl glsl shadow

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

如何在Linux上使用另一个libC进行编译?(GCC)

我想用另一个C库(如dietlibc或musl)编译我的C程序.

我应该为此目的使用什么gcc选项?

c gcc libc

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

如何检查引用是否为常量?

我正在为我的迭代器类型编写一个测试,并想检查由begin()和提供的解引用迭代器返回的引用cbegin()分别是非常量和常量。

我尝试做类似以下的事情: -

#include <type_traits>
#include <iostream>
#include <vector>

int main() {
    std::vector<int> vec{0};

    std::cout << std::is_const<decltype(*vec.begin())>::value << std::endl;
    std::cout << std::is_const<decltype(*vec.cbegin())>::value << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

但这0两种情况都会打印出来。

有没有办法检查引用是否为常量?

我可以使用 C++11/14/17 特性。

c++ iterator reference constants type-traits

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

这条线的目的是什么?(功能声明)

我正在通过K&R学习编程.到目前为止还不错,但我不清楚第1.8节(函数)中的一行代码的作用.

在1.8节中,作者向您展示了如何创建一个函数来将一个整数提升到另一个整数的幂.

我已经粘贴了下面的代码,正如书中所写的那样.一切都很好.但我不知道为什么他们把这条线包括在最上面:

int power(int m, int n);
Run Code Online (Sandbox Code Playgroud)

这本书没有提到它,除了说该程序将整数m提高到幂n.如果我从代码中删除该行,程序仍然按预期输出.

如果我理解这一点,就行了

int power(int base, int n)
Run Code Online (Sandbox Code Playgroud)

创建函数,下面的大括号定义函数.然后main下的大括号调用函数输出图表.

所以这一切似乎都有道理.但我不明白最重要的是什么.

这可能是无关紧要的,但我似乎更有可能错过了一些东西.任何人都可以告诉我为什么那条线在那里?

#include <stdio.h>

int power(int m, int n);

/* test power function */
main()
{
int i;

    for (i = 0; i < 10; ++i)
        printf("%d %d %d\n", i, power(2,i), power(-3, i));
    return 0;
}

/* power: raise base to n-th power; n >= 0 */

int power(int base, int n)
{
    int i, p;

    p = 1;
    for (i = 1; i …
Run Code Online (Sandbox Code Playgroud)

c kr-c kernighan-and-ritchie

3
推荐指数
1
解决办法
571
查看次数

在Python中乘以元组

我需要创建一个嵌套的元组,其中一些值是相同的,所以我尝试将它们相乘.

t = ((('a', 'b'),) * 3)
print t
Run Code Online (Sandbox Code Playgroud)

打印

(('a', 'b'), ('a', 'b'), ('a', 'b'))
Run Code Online (Sandbox Code Playgroud)

有没有一种语法上更好的方法来做到这一点?

谢谢.

python tuples multiplying

2
推荐指数
1
解决办法
1773
查看次数

如何在c ++中使用std :: sort()作为长long向量?

我有一个long long类型的向量,并希望按升序对它进行排序,但我认为我误解了std :: sort()的用法.

#include <vector>
#include <algorithm>
#include <functional>

...

std::vector<long long> numbers (4);
numbers[0] = 6;
numbers[1] = 4;
numbers[2] = 3;
numbers[3] = 7;
Run Code Online (Sandbox Code Playgroud)

我试过用:

std::sort(numbers.begin(), numbers.end(), std::greater<long long>());
Run Code Online (Sandbox Code Playgroud)

但我得到一个错误

std::vector<long long int>’ is not derived from ‘const std::basic_string<_CharT, _Traits, _Alloc>’
Run Code Online (Sandbox Code Playgroud)

另外,理想情况下我想仅在两个元素之间对向量进行排序,例如在数字[1]和数字[2]之间; 但是对前两个参数使用这些值似乎不起作用.

谢谢.

编辑:另外,我正在使用g ++编译器

c++ sorting vector

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

Perl:清除嵌套哈希值

如果我将哈希引用定义为:

my %hash1=(
    "a" => 1,
    "b" => 2,
    "c" => {
               "d" => 4,
               "e" => 5
           }
    );

my $r_hash1 = \%hash1;
Run Code Online (Sandbox Code Playgroud)

会使用:

$r_hash1->{c}=();
Run Code Online (Sandbox Code Playgroud)

清除%hash1 {c}中的键是否可以重用?

如果是这样,我也想知道我是否有:

my %hash1=(
    "a" => 1,
    "b" => 2
);

my %hash2=(
    "d" => 4,
    "e" => 5
);

my $r_hash1 = \%hash1;
my $r_hash2 = \%hash2;

$r_hash1->{"c"} = $r_hash2;
Run Code Online (Sandbox Code Playgroud)

是否使用:

$r_hash1->{c}=();
Run Code Online (Sandbox Code Playgroud)

释放%hash2使用的内存以供重用,因为它必须在哈希上下文中使用:

%$r_hash1->{c}
Run Code Online (Sandbox Code Playgroud)

但是这会在哈希上下文中查看$ r_hash1,而不是$ r_hash1 - > {c}的内容.

谢谢.

perl hash nested clear

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

装饰外部(库)函数的正确方法是什么?

我在我的代码中多次使用库函数来测试通过/失败条件并相应地执行不同的代码,但由于某种原因,它找不到结果的返回值; 我想用装饰器添加它,以便我可以在我的代码中调用它.

鉴于我无法编辑源文件,这样做的正确方法是什么?

我应该这样做:

def test_pass(param1, param2):
    external_function(param1, param2)
    if(...):
        return False
    else:
        return True
Run Code Online (Sandbox Code Playgroud)

或者有没有办法使用漂亮的@decorator语法?

python decorator python-2.7 python-decorators

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

显示空元组列表的最佳方法

在python脚本中,我使用一个列表来存储四个元组,并且存储的实际元组将在脚本中更改.

目前,我在脚本顶部初始化列表,如下所示:

tuples = [(),(),(),()]
Run Code Online (Sandbox Code Playgroud)

然而,这似乎相当丑陋.

然后我以不同的方法迭代地将每个索引分配给生成的元组:

for i in xrange(0, 4):
    tuples[i] = ('a', 'b')
Run Code Online (Sandbox Code Playgroud)

实际值会彼此不同,这只是一个例子.


或者,我可以在每次调用方法时清除列表,而不是像上面那样初始化它:

tuples = []
Run Code Online (Sandbox Code Playgroud)

然后将四个项目附加到它:

for i in xrange(0, 4):
    tuples.append('a', 'b')
Run Code Online (Sandbox Code Playgroud)

这似乎也是无关紧要的,因为列表只有四个值.

什么是最好的(最pythonic?)方式来做到这一点?

python tuples list python-2.7

0
推荐指数
1
解决办法
67
查看次数