- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的wip游戏中,我想达到一个吸引眼球的地步。目前,我在Ambientlight
中添加了一些Directionla-light
和Environment
并用它渲染场景。但是现在我想向其中添加一个自定义的Shader
。因此,我一直在寻找一些教程,并且出于某种原因,在几乎每个教程中,他们都在游戏中使用了Shader
的另一个“版本”:
ModelBatch
一个String
或FileHandle
vertex/fragment
-shader ShaderProgram
创建一个Shader
。 DefaultShader
创建新的Shader
。 Shader
并使用此ShaderClass
。 ShaderProvider
和其他类。
ModelBatch
。 Array<ModelInstance>
的Shader
实例。 Texture
及其NormalMap
,都存储为Texture
。 position
,direction
和color
表示为Vector3
,其强度表示为float
。 color
,指定为Vector3
和float
。 Vector3
”形式给出的“Falloff”灯。 Texture
及其Normal Map
绑定(bind)到Shader
。 Shader
。 Shader
提供环境光的颜色和强度。 Falloff
向量提供给Shader
。 Shader
用于Array
中所有与我的ModelBatch
一起绘制的“实例”。 Texture
。
ModleInstance
都带有带纹理的
Material
。我拥有所有这些不同
Texture
的法线贴图。现在,我希望能够根据
Texture
的
Normal Map
中的
Shader
将正确的
Texture
和
Material
绑定(bind)到
Modelinstance
。
Shader
使用不同的
ModelTypes
(Stonewall使用不带“Specularity”和“Reflection”的
Shader
,而Metalwalls使用
Specularity
)。
setUniformi
)。
Shader
类,该类实现
Shader
。但是我想听听有关设计,性能和可能的限制的所有其他可能性,它们的优缺点。
最佳答案
可以在here中找到有关3d api渲染管道的总体说明。 This tutorial指导您从头开始创建新的Shader
。 this tutorial展示了如何使用自定义属性将数据传递到着色器。 This wiki page还说明了如何使用Material
Attributes
以及Attributes
支持的DefaultShader
。
在LibGDX中,Shader
和ShaderProgram
之间存在区别。 ShaderProgram
只是GPU实现(顶点和片段着色器程序),基本上只是编译后的GLSL文件。例如,您可以在ShaderProgram
上设置制服,然后用它来渲染网格。但是ShaderProgram
本身并不“知道”如何呈现模型。Shader
接口(interface)旨在弥合ShaderProgram
和Renderable
(后者是模型的最小可渲染部分)之间的间隙。因此,Shader
最通常会封装ShaderProgram
并确保设置正确的制服等。(请注意,严格来说Shader
不必封装ShaderProgram
。例如,在删除GLES1支持之前,还有一个GLES1着色器可以管理固定渲染管道,而不是封装ShaderProgram
)
BaseShader
类是abstract
帮助器类,它实现Shader
接口(interface),封装了ShaderProgram
并添加了一些帮助器方法来轻松设置制服。如果您扩展此类,则可以轻松实现register
和set
统一,例如像这样:
public class MyShader extends BaseShader {
public final int u_falloff = register("u_falloff");
...
@Override
public void render (final Renderable renderable) {
set(u_falloff, 15f);
...
super.render(renderable);
}
}
15f
(它将调用setUniformX)。如果
ShaderProgram
(glsl文件)未实现名为“u_falloff”的统一名称,则它将简单地忽略该调用。您也可以使用
if (has(u_falloff)) { /* calculate falloff and set it */ }
进行检查。
BaseShader
还增加了为每个制服使用
Validator
和
Setter
的可能性。
DefaultShader
扩展了
BaseShader
并为大多数
Material
Attributes
添加了默认实现。如果要查看每个制服的名称,请看看
at the source。实际上,如果使用与DefaultShader相同的统一命名,则可以仅指定glsl文件,并让DefaultShader负责设置统一。当然,可以扩展DefaultShader以添加其他制服。
ModelBatch#render(...)
时,
ModelBatch
将查询
ShaderProvider
以获取要使用的
Shader
。这是因为顶点属性和 Material 属性的每种可能组合都可能需要不同的
Shader
。例如,如果您有两个
ModelInstance
(或更准确地说,两个
Renderable
),一个具有
TextureAttribute.Diffuse
,一个没有纹理但具有
ColorAttribute.Diffuse
。然后,最常见的是,ShaderProvider需要创建两个不同的
Shader
。请注意,它们可以属于同一类(例如DefaultShader),但是底层的GLSL文件可能不同。
DefaultShader
使用预处理器宏(ubershader)来处理此问题。根据顶点属性和 Material 属性,它将
#define
多个标志,从而使glsl程序专门针对顶点和 Material 属性的组合进行编译。如果您想了解如何完成,请查看
the glsl files。
ShaderProvider
和自己的
Shader
(通过从头开始实现,扩展
BaseShader
或扩展
DefaultShader
)。您可以为此扩展
DefaultShaderProvider
,并在需要时退回到
DefaultShader
,例如:
public class MyShaderProvider extends DefaultShaderProvider {
... // implement constructor
@Override
protected Shader createShader (final Renderable renderable) {
if (renderable.material.has(MyCustomAttribute.Type))
return new MyShader(renderable);
else
return super.createShader(renderable);
}
}
关于opengl - libgdx如何在3D中使用着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22553409/
在 OpenGL/ES 中,在实现渲染到纹理功能时,您必须小心,不要引起反馈循环(从正在写入的同一纹理中读取像素)。由于显而易见的原因,当您读取和写入纹理的相同像素时,行为是未定义的。但是,如果您正在
正如我们最终都知道的那样,规范是一回事,实现是另一回事。大多数错误是我们自己造成的,但有时情况并非如此。 我相信列出以下内容会很有用: GPU 驱动程序中当前已知的与最新版本的 OpenGL 和 GL
很难说出这里问的是什么。这个问题是模棱两可的、模糊的、不完整的、过于宽泛的或修辞的,无法以目前的形式得到合理的回答。为了帮助澄清这个问题以便可以重新打开它,visit the help center
我正在学习 OpenGL,非常想知道与显卡的交互如何。 我觉得了解它是如何在图形驱动程序中实现的,会让我了解 opengl 的完整内部结构(通过这个我可以知道哪些阶段/因素影响我对 opengl 性能
我正在尝试绘制到大于屏幕尺寸(即 320x480)的渲染缓冲区 (512x512)。 执行 glReadPixels 后,图像看起来是正确的,除非图像的尺寸超过屏幕尺寸——在本例中,超过 320 水平
我正在 Windows 中制作一个 3D 小行星游戏(使用 OpenGL 和 GLUT),您可以在其中穿过一堆障碍物在太空中移动并生存下来。我正在寻找一种方法来针对无聊的 bg 颜色选项设置图像背景。
如果我想要一个包含 100 个 10*10 像素 Sprite 的 Sprite 表,是否可以将它们全部排成一排来制作 1,000*10 像素纹理?还是 GPU 对不那么窄的纹理表现更好?这对性能有什
这个问题在这里已经有了答案: Rendering 2D sprites in a 3D world? (7 个答案) 关闭 6 年前。 我如何概念化让图像始终面对相机。我尝试将三角函数与 arcta
是否可以在 OpenGL 中增加缓冲区? 假设我想使用实例化渲染。每次在世界上生成一个新对象时,我都必须用实例化数据更新缓冲区。 在这种情况下,我有一个 3 个 float 的缓冲区 std::v
有人可以向我解释为什么下面的代码没有绘制任何东西,但如果我使用 GL_LINE_LOOP 它确实形成了一个闭环吗? glBegin(GL_POLYGON); for(int i = 0; i <= N
正如标题所说,OpenGL 中的渲染目标是什么?我对 OpenGL 很陌生,我看到的所有网站都让我很困惑。 它只是一个缓冲区,我在其中放置稍后将用于渲染的东西吗? 如果您能提供一个很好的引用来阅读它,
当使用 OpenGL 1.4 固定功能多纹理时,每个纹理阶段的输出在传递到下一个阶段之前是否都固定在 [0, 1]? spec说(第 153 页): If the value of TEXTURE_E
我比较了 2 个函数 openGL ES 和 openGL gvec4 texelFetchOffset(gsampler2DArray sampler, ivec3 P, int lod, ivec
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
那么当你调用opengl函数时,比如glDraw或者gLBufferData,是否会导致程序线程停止等待GL完成调用呢? 如果不是,那么 GL 如何处理调用像 glDraw 这样的重要函数,然后立即更
我正在尝试实现级联阴影贴图,当我想访问我的视锥体的每个分区的相应深度纹理时,我遇到了一个错误。 更具体地说,当我想选择正确的阴影纹理时会出现我的问题,如果我尝试下面的代码,我会得到一个像 this 中
我想为OpenGL ES和OpenGL(Windows)使用相同的着色器源。为此,我想定义自定义数据类型并仅使用OpenGL ES函数。 一种方法是定义: #define highp #define
我尝试用 6 个位图映射立方体以实现天空盒效果。我的问题是一个纹理映射到立方体的每个面。我已经检查了 gDEBugger,在立方体纹理内存中我只有一个 图像(因为我尝试加载六个图像)。 代码准备纹理:
在 OpenGL 中偏移深度的最佳方法是什么?我目前每个多边形都有索引顶点属性,我将其传递给 OpenGL 中的顶点着色器。我的目标是在深度上偏移多边形,其中最高索引始终位于较低索引的前面。我目前有这
我是一名优秀的程序员,十分优秀!