标签: shader

glUseProgram(0)有什么作用?

OpenGL文档glUseProgram声称,使用参数调用它将导致着色器执行的结果undefined.

但是,经过一番搜索后,我看到了几个人glUseProgram用来卸载当前着色器程序的例子.

这种行为可靠吗?如果没有,那到底究竟做了glUseProgram(0)什么?

opengl api shader

18
推荐指数
2
解决办法
2万
查看次数

现代OpenGL阴影立方体贴图上的指针?

背景

我正在使用C++和现代OpenGL(3.3)开发3D游戏.我现在正致力于光照和阴影渲染,并且我已经成功实现了方向阴影贴图.在阅读了游戏要求后,我决定要点光影映射.在做了一些研究之后,我发现要做全向阴影贴图,我会做类似于定向阴影贴图的事情,但是使用立方体贴图.

我以前没有立方体贴图的知识,但我对它们的理解是立方体贴图是六个纹理,无缝连接.我做了一些环顾四周但不幸的是我很难找到关于现代OpenGL主题的权威"教程".我首先寻找教程,从头到尾解释它,因为我认真地努力学习源代码片段或概念,但我尝试过.

目前的理解

以下是我对这个想法的一般理解,减去技术性.请指正.

  • 对于每个点光源,都会设置帧缓冲,就像定向阴影贴图一样
  • 然后生成单个立方体贴图纹理并绑定glBindTexture(GL_TEXTURE_CUBE_MAP, shadowmap).
  • 立方体贴图使用以下属性设置:

    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARB, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    
    Run Code Online (Sandbox Code Playgroud)

(这也类似于定向阴影贴图)

  • 现在glTexImage2D()迭代六次,每次面部一次.我这样做:

     for (int face = 0; face < 6; face++) // Fill each face of the shadow cubemap
         glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, GL_DEPTH_COMPONENT32F , 1024, 1024, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
    
    Run Code Online (Sandbox Code Playgroud)
  • 通过调用将纹理附加到帧缓冲区

    glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, shadowmap, 0);
    
    Run Code Online (Sandbox Code Playgroud)
  • 当要渲染场景时,它将以两个过程渲染,如定向阴影贴图.

  • 首先,绑定阴影帧缓冲区,将视口调整为阴影贴图的大小(在这种情况下为1024×1024).
  • 剔除设置在正面 glCullFace(GL_FRONT)
  • 活动着色器程序切换到顶点和片段阴影着色器,我将提供进一步向下的源
  • 计算所有六个视图的光视图矩阵.我是通过创建glm :: mat4和push_back()矩阵的向量来实现的,如下所示:

    // Create the six view matrices …
    Run Code Online (Sandbox Code Playgroud)

c++ opengl 3d shader shadow-mapping

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

glUniform4fv给出了GL_INVALID_OPERATION

我试图在iOS和OpenGL ES中开发一个基本游戏,但是我在制服上遇到了这个问题,这里是将值传递给我的制服的代码:

glBindVertexArrayOES(_vertexArray);

// Render the object with ES2
glUseProgram(self.shaderProgram);

glUniformMatrix4fv(uniformModelViewProjection, 1, 0, modelViewProjectionMatrix.m);

// Get uniform center position
glUniform4fv(uniformCenterPosition, 1, centerPosition.v);
// Get uniform time position
glUniform1f(uniformTime, time);

// Set the sampler texture unit to 0
glUniform1i(uniformTexture, 0);
glDrawArrays(GL_POINTS, 0, numVertices);
Run Code Online (Sandbox Code Playgroud)

请注意,在glDseProgram之前和glDrawArrays调用之前,已经注意定位glUniform函数.通过追踪确认均匀位置也很好.以下是我在XCode中运行OpenGL ES Analyzer工具时得到的结果:

在此输入图像描述

它为glUniform4fv返回GL_INVALID_OPERATION,注意表示的值似乎是正确的.

以下是我从文档中找到的GL_INVALID_OPERATION错误的可能原因:

  • 没有当前的程序对象.
  • 着色器中声明的统一变量的大小与glUniform命令指示的大小不匹配.
  • 此函数的有符号或无符号整数变量之一用于加载float,vec2,vec3,vec4或其数组的统一变量,或者如果使用此函数的某个浮点变量加载int,ivec2,ivec3,ivec4,unsigned int,uvec2,uvec3,uvec4或其数组的统一变量.
  • 此函数的一个有符号整数变体用于加载unsigned int,uvec2,uvec3,uvec4或其数组的统一变量.
  • 此函数的一个无符号整数变体用于加载int,ivec2,ivec3,ivec4或其数组的统一变量.
  • location是当前程序对象的无效统一位置,位置不等于-1.
  • count大于1且指示的统一变量不是数组变量.
  • 使用除glUniform1i和glUniform1iv之外的命令加载采样器.

他们似乎没有解释为什么我收到这个错误.它让我发疯,请帮忙!

iphone shader opengl-es ios

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

OpenGL中的着色器是什么?我们需要它们是什么?

我不是母语是英语,当我试图通过openGL的维基和教程www.learnopengl.com得到的,它永远不会结束的直觉概念如何整部作品可以理解的.有人可以用更抽象的方式向我解释它是如何工作的吗?什么是顶点着色器和片段着色器以及我们将它们用于什么?

opengl shader

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

为什么有必要为片段着色器设置精度?

我学习WebGL.下一个着色器工作正常:

// vertex.shader
// precision mediump float;
attribute vec4 a_Position;
attribute float a_PointSize;

void main(){
  gl_Position = a_Position;
  gl_PointSize = a_PointSize;
}
Run Code Online (Sandbox Code Playgroud)

// fragment.shader
precision mediump float;
uniform vec4 u_FragColor;

void main(){
  gl_FragColor = u_FragColor;
}
Run Code Online (Sandbox Code Playgroud)

为什么有必要为片段着色器设置精确度?顶点着色器在没有这个的情况下工作,但片段着色器在没有此代码行的情况下不起作用(如我所见).为什么存在不同的行为?

我之前读过这篇文章,但它对我没有帮助.

precision shader opengl-es webgl

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

使用着色器在opengl中绘制深度值

我想在片段着色器中绘制深度缓冲区,我这样做:

顶点着色器:

varying vec4 position_;

gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
position_ = gl_ModelViewProjectionMatrix * gl_Vertex;
Run Code Online (Sandbox Code Playgroud)

片段着色器:

float depth = ((position_.z / position_.w) + 1.0) * 0.5;

gl_FragColor = vec4(depth, depth, depth, 1.0);
Run Code Online (Sandbox Code Playgroud)

但是我打印的都是白色的,我做错了什么?

opengl shader

17
推荐指数
2
解决办法
2万
查看次数

GLSL着色器中cos()和sin()函数的速度?

我感兴趣的是关于速度的信息sin(),并cos()Open GL的着色语言.

所述GLSL规范文献表明:

内置功能基本上分为三类:

  • ...
  • ...
  • 它们代表一种操作图形硬件可能在某些时候加速.三角函数属于这一类.

编辑:

正如已经指出的那样,像计算单个操作的时钟周期sin(),并cos()没有真正告诉整个故事的性能.

因此,为了澄清我的问题,我真正感兴趣的是,是否值得优化sin()cos()呼吁常见案例.

例如,在我的应用程序中,参数将是非常常见的0.这样的事情是否有意义:

float sina, cosa;

if ( rotation == 0 )
{
   sina = 0;
   cosa = 1;
}
else
{
   sina = sin( rotation );
   cosa = cos( rotation );
}
Run Code Online (Sandbox Code Playgroud)

或将GLSL编译器或sin()cos()实现照顾优化像我吗?

opengl optimization shader glsl jogl

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

openGL:带着色器的线条

如何使用着色器创建一条线(可能是彩色的)?我正在使用可编程管道,我是openGL的初学者.我找不到一个如何使用着色器绘制线条的示例..我想我必须将VAO(顶点数组对象)加载到着色器中,但那又是什么?我应该使用哪些功能以及如何使用?

c++ opengl graphics shader glsl

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

将GPU计算结果返回到OpenGL中的CPU程序

有没有办法将运行在GPU上的着色器的结果返回到CPU上运行的程序?

我想基于GPU上的计算成本高的算法从简单的体素数据生成多边形网格,但我需要在CPU上进行物理计算.

opengl cpu shader video-card

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

如何计算像素着色器深度以将点精灵上绘制的圆渲染为与其他对象相交的球体?

我正在编写一个着色器,通过绘制阴影圆圈在点精灵上渲染球体,并且需要编写深度分量和颜色,以便彼此相邻的球体正确相交.

我使用的代码类似于Johna Holwerda编写的代码:

void PS_ShowDepth(VS_OUTPUT input, out float4 color: COLOR0,out float depth : DEPTH)
{
   float dist = length (input.uv - float2 (0.5f, 0.5f)); //get the distance form the center of the point-sprite
   float alpha = saturate(sign (0.5f - dist));
   sphereDepth = cos (dist * 3.14159) * sphereThickness * particleSize; //calculate how thick the sphere should be; sphereThickness is a variable.

   depth = saturate (sphereDepth + input.color.w); //input.color.w represents the depth value of the pixel on …
Run Code Online (Sandbox Code Playgroud)

math directx 3d shader hlsl

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

标签 统计

shader ×10

opengl ×7

3d ×2

c++ ×2

glsl ×2

opengl-es ×2

api ×1

cpu ×1

directx ×1

graphics ×1

hlsl ×1

ios ×1

iphone ×1

jogl ×1

math ×1

optimization ×1

precision ×1

shadow-mapping ×1

video-card ×1

webgl ×1