我的父亲是色盲,并且考虑到我在视觉效果很重要的游戏中工作,我一直想为屏幕截图(甚至是某种类型的着色器)编写模拟不同形式色盲的过滤器.
我见过很多参考文献,但从来没有能够追踪算法.
任何算法将不胜感激.
我一直在使用OpenGL了大约一年了,学到了很多东西.不幸的是我的方式得知这是旧的预3.x的方式,这意味着即时模式,默认着色器,矩阵堆栈等我或多或少都有哪些通过观察OpenGL的规格已经从再改为现在的想法,但是我并不完全了解一些新的做事方式.
从我的理解,他们摆脱了矩阵堆叠的,这意味着你必须跟踪自己的变换矩阵,这似乎并没有太复杂的.他们还摆脱了直接模式,这意味着你现在需要使用维也纳组织或VAOs(永远不知道哪一个,或许两个..)发送像素/正常/纹理等.着色器程序的信息.我真的不明白这些对象的工作方式,我认为你需要把所有的信息放进去,并提供某种形式的OFSET显示像素,正常和纹理坐标之间的分隔符.有人可以简单解释一下这实际上是如何工作的(或者给我一个解释它的链接)?我尝试维基百科和谷歌搜索,但发现自己还是没有完全理解它们.
我想更多地了解的另一点是着色器,因为我从未使用它们.我不会问如何编写它们或任何东西,只需要在那里进行什么以及opengl仍然为你做什么.更具体地说,您需要在着色器中执行哪些操作才能获得基本渲染程序?我知道你需要做所有的计算并使用你的矩阵来计算真实的顶点位置.但是opengl是否仍然会处理背面剔除,线条剪裁,多边形填充和其他较低级别的问题,或者您是否必须将它们编码到着色器中(或者它们甚至不属于着色器)?
我最近一直在做一些DirectX 10工作,我正在寻求转向DirectX 11和Shader Model 5.0.我过去曾写过一些非常简单的着色器,我正在寻求拓宽视野,开拓更复杂的着色器.我的问题有点多重:
什么是编程着色器的最佳工具?我只使用了visual studio和SOME FX作曲家 - 阅读:足以打开它并查看它.
gfx卡的品牌是否会影响您可以编程的着色器类型?
排序与#1相同的问题,但如果您打算编写DirectX着色器而非特定于供应商,是否可以使用跨供应商工具?
我一直在寻找OpenGL着色器的例子,我看到了一些不同的风格.一些着色器专门使用内置类型(即gl_Vertex)与应用程序代码和着色器之间传输数据.
一些着色器使用变化类型将数据从顶点传输到片段着色器而不是gl_Position和gl_FragColor.
一些着色器使用前缀'in'和'out'来指定数据传输:
in vec3 vertex;
void main() {
gl_Position = projection_matrix * modelview_matrix * vec4(vertex, 1.0);
}
Run Code Online (Sandbox Code Playgroud)
...而其他人使用属性:
attribute vec4 vertex_attrib;
attribute vec4 tex_coord_attrib;
attribute vec4 color_attrib;
uniform mat4 mvp_matrix;
uniform mat4 texture_matrix;
varying vec4 frag_color;
varying vec2 tex_coord;
void main(void)
{
gl_Position = mvp_matrix * vertex_attrib;
vec4 transformed_tex_coord = texture_matrix * tex_coord_attrib;
tex_coord = transformed_tex_coord.st / transformed_tex_coord.q;
frag_color = color_attrib;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,GLES 2.0中编写着色器的首选方法是什么?有最佳实践指南吗?有人可以提供一个顶点和片段着色器的例子,它是"怎样做"的光辉榜样?
谢谢.
我想使用OpenGL ES进行Android相机预览并保存捕获的图像.
我喜欢在Android相机中使用OpenGL ES来为Android相机提供一些效果.所以请有人告诉我该怎么做?
我已经看到在QML中有一个Bezier曲线的示例实现,但我正在寻找一个如何实现虚线或点状贝塞尔曲线的提示.据我所知,Bezier曲线示例的作者QSGGeometryNode用于存储内部,QSGGeometry并QSGFlatColorMaterial在其上应用了材料.然后,他们只需创建点列表并在它们之间绘制段.
是否有可能写一个shader,并把它应用到QSGFlatColorMaterial(以显示线dashed,dotted等等)?
最终,是否可以存储多个QSGGeometry内部QSGGeometryNode?
UPDATE
我想在"纯QtQuick"中实现它- 而不是在"旧"接口(例如QPainter etc)中 - 因为我不想使用切换上下文(openGL和CPU)的东西.我更喜欢使用自定义着色器的解决方案(如果它可行) - 因为我将有更多的可能性来实现自定义外观(虚线,溺爱,彩色,可能是动画等).
如果不可能,我会用QPainter.
我已经阅读了一些关于GLSL的教程.在某些位置属性是某些vec3中的vec4.我知道矩阵运算需要一个vec4,但是值得发送一个额外的元素吗?发送vec3并稍后在着色器vec4(位置,1.0)中投射是不是更好?内存中的数据越少 - 速度越快?或者我们应该包装一个额外的元素,以避免铸造?
什么提示应该更好?
layout(location = 0) in vec4 position;
MVP*position;
Run Code Online (Sandbox Code Playgroud)
要么
layout(location = 0) in vec3 position;
MVP*vec4(position,1.0);
Run Code Online (Sandbox Code Playgroud) 是否可以使用着色器计算某些值,然后将它们返回以供进一步使用?
例如,我将网格向下发送到GPU,有一些关于如何修改它的参数(改变顶点的位置),并收回结果网格?我认为这是不可能的,因为我没有看到任何从着色器到CPU的通信变量.我正在使用GLSL,所以只有统一,属性和变化.我应该使用属性还是制服,渲染后它们是否仍然有效?我可以更改这些变量的值并在CPU中读回吗?有一些方法可以在GPU中映射数据但是这些方法会被更改和有效吗?
这是我正在考虑的方式,虽然可能有其他方式,这对我来说是不可知的.如果有人能解释我的话,我会很高兴,因为我刚读了一些关于GLSL的书,现在我想编写更复杂的着色器,我不想放弃目前不可能的方法.
谢谢
第一; 如何编译OpenGL着色器?它们是在CPU或GPU上编译的,还是因实现而有所不同?不同的供应商有不同的二进制输出; 如果是这样,是否有可能在另一个GPU上交叉编译一个GPU类型的二进制文件?我正在开发一款我计划在英特尔GFX芯片,ATI卡和NVidia卡上运行的游戏.我宁愿只发送着色器的二进制部分,而不必在客户端计算机上编译源代码.这可能吗?着色器编译过程如何工作?
我正在查看使用着色器的OpenGL应用程序的来源.一个特殊的着色器看起来像这样:
uniform float someConstantValue;
void main()
{
// Use someConstantValue
}
Run Code Online (Sandbox Code Playgroud)
统一是从代码设置一次,并且在整个应用程序运行时都不会更改.
在什么情况下我想宣布someConstantValue为a uniform而不是const float?
编辑: 只是为了澄清,常数值是物理常数.