标签: shading

MATLAB pcolor/surf双线性插值(着色interp)

考虑以下MATLAB代码:

C = [ 0 0 0 0 0
      0 1 2 1 0
      0 2 4 2 0
      0 1 2 1 0
      0 0 0 0 0 ];
pcolor( C );
shading interp;
axis square
Run Code Online (Sandbox Code Playgroud)

注意,C在90度旋转下是不变的.另请注意以下句子中的帮助pcolor:

使用着色interp,使用C的所有元素,通过四个顶点处的颜色的双线性插值对每个单元进行着色.

但是,绘制的图像如下:

CodeOutput

请注意,图像在90度旋转下不是不变的(例如考虑四个角).现在,除非我可怕地误解双线性插值,否则这一定是错的.MATLAB似乎是在三角形上插值,这与双线性插值不同.

有没有办法解决这个MATLAB错误,并获得正确的双线性插值?(除了我自己手动插入额外的点,如果放大到足够远,这仍然无法解决问题.)

matlab surface matlab-figure shading bilinear-interpolation

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

如何使用 gltf 格式通过 Assimp 加载粗糙度/金属贴图?

我尝试加载 gltf 格式的场景。它具有金属和粗糙纹理(未嵌入)。现在我想使用 Assimp 加载具有指定纹理的模型。我使用 GetTexture() 检索纹理,但 aiTextureType 没有粗糙度/金属的成员。

所以问题是:我如何导入它们?由于 Assimp 支持 gltf,因此它也必须以某种方式支持基于物理的材质贴图。

谢谢

assimp shading gltf

7
推荐指数
2
解决办法
5682
查看次数

函数调用与内联之间的 GLSL 性能差异

如果像 + 运算符这样简单的东西被包装到函数中,GLSL 中的性能是否会有所不同?

例如这两种情况:

示例1:

in uniform float uValueA;
in uniform float uValueB;

void main()
{
    float value = uValueA + uValueB;
    // [...]
}
Run Code Online (Sandbox Code Playgroud)

示例2:

in uniform float uValueA;
in uniform float uValueB;

float addValues(float a, float b)
{
    return a + b;
}

void main()
{
    float value = addValues(uValueA, uValueB);
    // [...]
}
Run Code Online (Sandbox Code Playgroud)

编译后的最终产品有什么区别吗?或者它们会产生相同数量的指令和性能吗?

opengl performance gpu glsl shading

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

Scala + SBT - 如何为着色的Akka库配置reference.conf

TL; DR

我试图遮蔽akka库的一个版本并将其与我的应用程序捆绑在一起(以便能够spray-can在CDH 5.7版本上运行服务器Spark 1.6).着色过程混淆了akka默认配置,并且在为阴影手动提供单独版本的akkas之后,看起来仍然看起来两个版本以某种方式混淆了.reference.confakka

是否akka已知阴影版本会导致问题?我究竟做错了什么?

背景

我有一个Scala/ Spark应用程序当前在Spark 1.6.1独立运行.应用程序使用spray-canhttp服务器运行spray 1.3.3,这需要akka 2.3.9(Spark 1.6.1独立包括兼容akka 2.3.11).

我正在尝试将应用程序迁移到运行该版本的新的Cloudera基于Spark群集的群集.问题是,在与捆绑这是不足够的正常工作.CDH 5.7Spark 1.6Spark 1.6CDH 5.7akka 2.2.3spray 1.3.3

试图解决方案

根据这篇文章中的建议,我决定将akka 2.3.9它与我的应用程序一起进行着色并捆绑.虽然这次我偶然发现了一个新问题 - akka它是否在reference.conf文件中定义了默认配置,该文件应该位于应用程序的类路径中.由于着色功能中的已知问题,sbt-assembly阴影 …

akka sbt-assembly apache-spark cloudera-cdh shading

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

如何在 OpenGL 中为 Phong 着色插值法线?

目前,我正在实施良好的旧 Phong 着色。总的来说,它看起来很正确,但在正常情况下出现了一种我无法解释的模式。

如果不仔细观察,我认为斯坦福兔子看起来很正确。 在此输入图像描述

但例如在耳朵上有一个奇怪的图案: 在此输入图像描述

在这张图片中,我可视化了法线并提高了饱和度以使问题更加明显。 在此输入图像描述

这是我的顶点着色器:

#version 330 core

layout (location = 0) in vec4 vPosition;
layout (location = 1) in vec3 vNormal;

out vec4 fWorldPosition;
smooth out vec3 fWorldNormalSmooth;

...    

void main() {
    fWorldNormalSmooth = normalize(NormalMatrix*vNormal);
    fWorldPosition = WorldMatrix*vPosition;
    gl_Position = ProjectionMatrix*ViewMatrix*WorldMatrix*vPosition;
}
Run Code Online (Sandbox Code Playgroud)

这是我的片段着色器:

#version 330 core

smooth in vec3 fWorldNormalSmooth;
in vec4 fWorldPosition;

out vec4 color;

...    

vec4 shadePointLight(Material material, PointLight pointLight, vec3 worldPosition, vec3 worldNormal) {
    vec3 cameraPosition = wdiv(inverse(ViewMatrix)*vec4(0, 0, 0, 1));
    vec3 …
Run Code Online (Sandbox Code Playgroud)

opengl phong shading

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

Phong 着色和 Gouraud 着色有什么区别?

据我了解,Gouraud着色计算每个顶点的光颜色并对该颜色进行插值,而Phong着色对每个像素的法线进行插值并根据该插值计算光颜色。

然而,当我尝试以数学方式导出光颜色时,我最终得到了两种方法相同的公式!

我为此画的图

(其中n1和n2是两个顶点的法线,t是插值系数,L是光线方向,顶部的平面和虚线表示屏幕和像素。)

两种方法的光颜色推导如下:

  • 古罗:L = t*dot(n1,L) + (1-t)*dot(n2,L)

  • 冯:L = dot(t*n1+(1-t)*n2,L)

结果是一样的。

谁能告诉我我的推导有什么问题吗?

graphics phong gouraud shading

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

Swift UI 阴影仅在符号之外

这里有两个 SF 符号,其中一个带有一些阴影。

在此输入图像描述

正如您所看到的,不仅第二个符号的外部有阴影,内部也有阴影。我如何仅对外部进行着色,而使内部空白保持白色而不是阴影?理想情况下,解决方案适用于其他 SF 符号,因为我计划对不仅仅是这个符号进行着色。

代码:

struct exampleSymbol: View {
    var body: some View {
        Image(systemName: "text.bubble.fill")
            .foregroundColor(.blue)
            .font(.system(size: 100))
    }
}

struct stack: View {
    var body: some View {
        VStack {
            exampleSymbol()
            exampleSymbol()
                .shadow(color: .gray, radius: 2, x: 3, y: 3)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

shading swiftui sf-symbols

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

不支持512字节长度的顶点着色器

我正在开发一个基于着色器的简单游戏,当我的顶点着色器文件长大,它的大小达到512字节,我现在无法用c ++加载它.我不认为这是一个常见的问题,但我猜测它来自我的自定义着色器加载器而不是来自opengl限制.这里是我的简单顶点着色器的代码(它应该将笛卡尔坐标映射到球形坐标,其大小为583bytes):

#version 330 core

uniform mat4 projection;
uniform mat4 camera;

layout (location=0) in vec3 vertex;
layout (location=1) in vec4 color;

in mat4 object;

out vec4 vColor;

void main()
{
  float x=sqrt(max(1.0-0.5*pow(vertex.y,2)-0.5*pow(vertex.z,2)+pow(vertex.y*vertex.z,2)/3.0,0.0));
  float y=sqrt(max(1.0-0.5*pow(vertex.x,2)-0.5*pow(vertex.z,2)+pow(vertex.x*vertex.z,2)/3.0,0.0));
  float z=sqrt(max(1.0-0.5*pow(vertex.x,2)-0.5*pow(vertex.y,2)+pow(vertex.x*vertex.y,2)/3.0,0.0));
  gl_Position=projection*camera*object*vec4(x,y,z,1.0); 
  vColor=color;
} 
Run Code Online (Sandbox Code Playgroud)

和加载器的代码:

GLuint vs;
vs=glCreateShader(GL_VERTEX_SHADER);
std::ifstream vertexShaderStream(_vsPath);
vertexShaderStream.seekg(0,std::ios::end);
unsigned int vsSourceLen=(unsigned int)vertexShaderStream.tellg();
vertexShaderStream.seekg(0,std::ios::beg);
char vertexShaderSource[vsSourceLen];
vertexShaderStream.read(vertexShaderSource,vsSourceLen);
vertexShaderStream.close();

const char *vsConstSource(vertexShaderSource);
glShaderSource(vs,1,&vsConstSource,NULL);
glCompileShader(vs);
int status;
glGetShaderiv(vs,GL_COMPILE_STATUS,&status);
if(!status)
{
    char log[256];
    glGetShaderInfoLog(vs,sizeof log,NULL,log);
    std::cout << log << std::endl;
    return -1;
}
Run Code Online (Sandbox Code Playgroud)

当我将大小减小到512字节以下(2 ^ 9 …

c++ opengl glsl vertex-shader shading

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