OpenGL文档glUseProgram
声称,使用参数零调用它将导致着色器执行的结果undefined
.
但是,经过一番搜索后,我看到了几个人glUseProgram
用来卸载当前着色器程序的例子.
这种行为可靠吗?如果没有,那到底究竟做了glUseProgram(0)
什么?
我正在使用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)当要渲染场景时,它将以两个过程渲染,如定向阴影贴图.
glCullFace(GL_FRONT)
计算所有六个视图的光视图矩阵.我是通过创建glm :: mat4和push_back()
矩阵的向量来实现的,如下所示:
// Create the six view matrices …
Run Code Online (Sandbox Code Playgroud)我试图在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错误的可能原因:
他们似乎没有解释为什么我收到这个错误.它让我发疯,请帮忙!
我不是母语是英语,当我试图通过openGL的维基和教程www.learnopengl.com得到的,它永远不会结束的直觉概念如何整部作品可以理解的.有人可以用更抽象的方式向我解释它是如何工作的吗?什么是顶点着色器和片段着色器以及我们将它们用于什么?
我学习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)
为什么有必要为片段着色器设置精确度?顶点着色器在没有这个的情况下工作,但片段着色器在没有此代码行的情况下不起作用(如我所见).为什么存在不同的行为?
我之前读过这篇文章,但它对我没有帮助.
我想在片段着色器中绘制深度缓冲区,我这样做:
顶点着色器:
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)
但是我打印的都是白色的,我做错了什么?
我感兴趣的是关于速度的信息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的初学者.我找不到一个如何使用着色器绘制线条的示例..我想我必须将VAO(顶点数组对象)加载到着色器中,但那又是什么?我应该使用哪些功能以及如何使用?
有没有办法将运行在GPU上的着色器的结果返回到CPU上运行的程序?
我想基于GPU上的计算成本高的算法从简单的体素数据生成多边形网格,但我需要在CPU上进行物理计算.
我正在编写一个着色器,通过绘制阴影圆圈在点精灵上渲染球体,并且需要编写深度分量和颜色,以便彼此相邻的球体正确相交.
我使用的代码类似于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)