Articles of 着色器

在着色器中的OpenGLES纹理坐标

目前我正在做一个使用OpenGL 2.0的android 2D游戏,我发现当渲染时,我的UV从来没有改变过所有的纹理,就像在Java代码中一样: public static FloatBuffer vertexUv; public static void setUpUV() { float uvs[] = {0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f }; ByteBuffer bb = ByteBuffer.allocateDirect(uvs.length*4); bb.order(ByteOrder.nativeOrder()); vertexUv = bb.asFloatBuffer(); vertexUv.put(uvs); vertexUv.position(0); } … //UV sending in render int mTexCoordLoc = glGetAttribLocation(program, "a_texCoord"); glEnableVertexAttribArray(mTexCoordLoc); glVertexAttribPointer(mTexCoordLoc, 2, GL_FLOAT, false, 0, vertexUv); … 问题是:即使UVs永远不会改变,我总是通过Java代码发送到GPU导致使用VBOs CPU的浪费( […]

如何改变顶点着色器中的FoV?

是否有可能改变视野顶点着色器? 我通过改变FoV值来缩放我的相机。 然而,这将导致天空盒也被放大,这不是我想要的。 是否有可能在顶点着色器中改变投影matrix的FoV值? 具体来说,我将投影matrix统一传递给glsl着色器。 我想在天空盒的顶点着色器中改变投影matrix的FoV值(以创建一个新的投影matrix)。

OpenGL几何着色器二维矩形挤压有奇怪的角度

我有一个几何着色器,在2d(通过输出三角形条)将线条拉伸成矩形。 当线不平行于X或Y轴,我得到的是平行四边形。 另外,当线平行于X轴时,看起来更细。 以下是我的结果,从不同角度画出4条线: 这里是几何着色器: #version 150 core layout(lines) in; layout(triangle_strip, max_vertices = 4) out; in vec3 Color[]; smooth out vec3 FColor; void main() { vec3 g1 = gl_in[0].gl_Position.xyz; vec3 g2 = gl_in[1].gl_Position.xyz; vec3 v1 = normalize(g1 – g2) * 0.1; vec3 v2 = normalize(g2 – g1) * 0.1; FColor = Color[0]; gl_Position = vec4(-v2.y […]

如何绘制纯色的连接线?

由于在OpenGL ES2中没有平面着色的选项,是否有一个解决方法,当不同的颜色传递给每个顶点时禁用颜色插值? 更新: 我正在使用Android的OpengGL ES 2.0。 我得到了这些顶点,我用它们与线连接绘制形状。 现在我需要单独改变每一行的颜色。 我试着通过顶点着色器为每个顶点传递一个颜色matrix到片段着色器,但颜色被内插(这实际上是有道理的,因为我给了两个顶点不同的颜色)。 我做了一些Googlesearch,发现glSmoothShader不能在OpengGL ES中被禁用。 有没有一种方法来颜色这些线没有颜色插入? 或者有没有办法使用多个三角形来绘制两个顶点之间的一条线,这样我就可以使每个三角形变平。

为什么我的渲染引擎只渲染一帧?

为了背景,我使用SharpDX DirectX包装器库在C#中devise了一个软引擎。 我已经开始实现渲染引擎,我可以渲染纹理到一张脸上,除了它只渲染一个帧。 它会渲染一个三角形,但是在下一次绘制调用时,屏幕将被清除。 即使我已经确定渲染调用仍在触发每一帧,渲染的项目将消失,并且不会在下一个或任何后续帧中重新绘制。 我认为这与我初始化资源的方式有关。 为了最大限度地减less着色器切换和提高性能,我让我的渲染引擎拥有一组预定义的着色器类。 然后,只有在必要时,着色器才能访问设备上下文,并在调用Shader.SetActive()方法时设置顶点,常量,索引等缓冲区。 当着色器需要渲染某些东西时,可以使用名为UpdateShader()的方法直接写入已经创建并在Shader.SetActive()方法中设置的缓冲区。 以下是SetActive()的源代码: public override void SetActive(D3D11.Device device, D3D11.DeviceContext context) { /*========================== Set Pointers to GPU Buffers ==========================*/ // write Matrix data first to constant buffer matrixBuffer = new D3D11.Buffer(device, matrixBufferDesc); vertexBuffer = new D3D11.Buffer(device, vertexBufferDesc); indexBuffer = new D3D11.Buffer(device, indexBufferDesc); context.InputAssembler.SetVertexBuffers(0, new D3D11.VertexBufferBinding(vertexBuffer, Utilities.SizeOf<VertexPositionTexture>(), 0)); context.InputAssembler.SetIndexBuffer(indexBuffer, Format.R32_UInt, […]

片段处理依赖于多边形大小?

我只是设置了一些简单的顶点/片段着色器来处理光照,而不是使用openGL调用。 我有几个地形VBOs设置,绘制了一百万左右的三角形进行testing(一堆随机spikey地面)。 我注意到,如果把所有的高度乘以5,使得spikey的地面更高,我看到FPS从大约98hz降到44hz。 在网上search的时候,我发现https://www.khronos.org/opengl/wiki/Performance里面写着:“对于大的多边形来说,碎片处理需要的时间比对小的要多得多”,这就解释了为什么我会看到这种下降。 但是,我找不到任何说明为什么。 所以我的问题是,为什么片段处理时间会根据多边形的大小而变化?

Unity Vertex着色器重新计算渲染器边界

我做了一个简单的广告牌gpu实例化顶点着色器,它基于投影matrix来操纵对象的顶点。 问题是渲染器边界不会更新来封装对象。 如果对象渲染边界不在视图中,对象会因为截断而消失,有没有办法在操作verticies之后重新计算渲染边界,或者是将边界手动操作为该对象的最大尺寸。

Monogame着色器扭曲渲染

我正在尝试将着色器后处理效果应用于我提供的游戏。 这里是游戏代码: namespace ShaderTestDesktop { public class Game1 : Game { private GraphicsDeviceManager graphics; private SpriteBatch _spriteBatch; private Texture2D _alien; private RenderTarget2D _renderTexture; private Effect _shader; private float _angle; private Vector2 _position; private bool _isShaderApplied; private KeyboardState _keyboardState; public Game1() { graphics = new GraphicsDeviceManager(this); Content.RootDirectory = "Content"; } protected override void Initialize() { base.Initialize(); […]

检索DirectX9着色器input参数(顶点input布局)

是否有可能从Direct3D9中的效果文件检索顶点input布局? 在Direct3D11中我可以通过使用来实现这一点 D3D11_SIGNATURE_PARAMETER_DESC paramDesc; ID3D11ShaderReflection* pRefector->GetInputParameterDesc(paramIndex, &paramDesc); 获取有关input参数的信息。 我希望在Direct3D9中有一个方法可以做到这一点。

获取着色器编译日志时得到垃圾

试图编译着色器并得到错误日志时,我得到了垃圾。 我检查了一些示例代码的代码,可以找出我做错了什么地方。 以下是我的代码: bool LoadShader(GLuint ShaderType, char const* ShaderFileName) { os_file ShaderFile = OSReadFile(ShaderFileName); GLint ShaderHandle = glCreateShader(ShaderType); DebugPrint("Shader source: %s\n%.*s\n", ShaderFileName, ShaderFile.Length, ShaderFile.Contents); GLchar* ShaderSource = (GLchar*)&ShaderFile.Contents; GLint ShaderSourceLength = ShaderFile.Length; glShaderSource(ShaderHandle, 1, &ShaderSource, &ShaderSourceLength); glCompileShader(ShaderHandle); OSFreeFile(&ShaderFile); GLint Success; glGetShaderiv(ShaderHandle, GL_COMPILE_STATUS, &Success); if (!Success) { GLchar CompileLog[512]; glGetShaderInfoLog(ShaderType, 512, NULL, CompileLog); switch (ShaderType) { […]