标签: shader

使用HTML5 WebGL着色器进行计算

在我看来,理论上可以使用WebGL进行计算 - 例如计算素数或π或沿着这些线的某些东西.但是,从我看到的很少,着色器本身不是用Javascript编写的,所以我有几个问题:

  1. 什么语言着色器写的?
  2. 考虑到着色器是如何工作的,尝试做这样的事情是否值得?
  3. 如何在运行时来回传递变量?或者如果不可能,在着色器完成执行后如何将信息传回?
  4. 由于它不是Javascript,如何处理非常大的整数(Java中的BigInteger或Javascript中的移植版本)?
  5. 我认为这会自动编译脚本,使其在图形卡中的所有核心上运行,我可以得到确认吗?

如果相关,在这种特定情况下,我试图将相当大的数字作为[非常]扩展的compsci项目的一部分.

编辑:

  1. WebGL着色器是用GLSL编写的.

javascript html5 shader webgl

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

GLSL gl_FragCoord.z计算和设置gl_FragDepth

所以,我有一个冒名顶替者(真正的几何体是一个立方体,可能被修剪,冒名顶的几何体是Menger海绵),我需要计算它的深度.

我可以相当容易地计算出在世界空间中抵消的金额.不幸的是,我花了好几个小时没有用它来扰乱深度.

我能得到的唯一正确结果是我去的时候:

gl_FragDepth = gl_FragCoord.z
Run Code Online (Sandbox Code Playgroud)

基本上,我需要知道如何计算gl_FragCoord.z,以便我可以:

  • 从gl_FragCoord.z到眼睛空间进行逆变换
  • 添加深度扰动
  • 将这个扰动的深度转换回与原始gl_FragCoord.z相同的空间.

如果这似乎是一个重复的问题,我道歉; 这里有很多其他帖子可以解决类似问题.但是,在实现所有这些之后,没有一个正常工作.而不是试图选择一个来获得帮助,此时,我要求完整的代码来完成它.它应该只是几行.

opengl shader glsl

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

GL_ARRAY_BUFFER目标在glBindBuffer中的含义是什么?

我对VBO很困惑,

glGenBuffers(1, &positionBufferObject);
glBindBuffer(GL_ARRAY_BUFFER, positionBufferObject);
Run Code Online (Sandbox Code Playgroud)

除了GL_ARRAY_BUFFER,还有其他目标类型:GL_ATOMIC_COUNTER_BUFFER,GL_COPY_READ_BUFFER ......

但是,Opengl手册没有提到这些目标的含义.我检查了glew.h:

#define GL_ARRAY_BUFFER 0x8892
Run Code Online (Sandbox Code Playgroud)

这是否意味着目标(如GL_ARRAY_BUFFER)是地址?

目标 - GL_ARRAY_BUFFER在glBindBuffer中的含义是什么?

opengl graphics shader opengl-es glsl

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

顶点着色器如何将颜色信息传递给片段着色器?

在一个简单的hello-world OpenGL程序中,它简单地在窗口上绘制一个静态三角形,当我将三角形的3个顶点设置为红色,绿色和蓝色时,三角形用渐变填充.

但是当我使用这样的着色器时:

顶点着色器:

attribute vec4 aVertex;
attribute vec4 aColor;

varying vec4 vColor;

void main(void) {
    gl_Position = gl_ModelViewMatrix * gl_ProjectionMatrix * aVertex;
    vColor = aColor;
}
Run Code Online (Sandbox Code Playgroud)

其中的属性aVertexaColor来自一个顶点缓冲,通过调用传递glVertexAttribPointer.

片段着色器:

varying vec4 vColor;
void main(void) {
    gl_FragColor = vColor;
}
Run Code Online (Sandbox Code Playgroud)

三角形仍然充满了渐变,这里有一个问题:

如果每个顶点计算顶点着色器,vColor则应为每个实例分配顶点的颜色.并且顶点颜色应该是红色,绿色或蓝色,如顶点缓冲区中设置的那样.

那么渐变来自哪里?

或者,换句话说,什么时候发生在碎片着色器中,vColor结果是插值颜色而不是顶点?

opengl shader glsl

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

你能在同一个程序中有多个像素(片段)着色器吗?

我想有两个像素着色器; 第一个做一件事,然后下一个做别的事情.这是可能的,还是我必须将所有内容打包到一个着色器中?

opengl shader pixel glsl fragment-shader

20
推荐指数
1
解决办法
9214
查看次数

在顶点和片段着色器中gl_Color和gl_FrontColor之间的关系是什么

我有传递顶点和片段着色器.

顶点着色器

void main(void)
{
    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
Run Code Online (Sandbox Code Playgroud)

片段着色器

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

那些产生空渲染(黑色不是像glClearBuffer那样的背景颜色).

如果我修改顶点着色器以将gl_FrontColor设置为gl_Color,它会渲染未触及的OpenGl缓冲区...具有传递着色器的预期行为.

void main(void)
{
    gl_FrontColor = gl_Color; //Added line
    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
Run Code Online (Sandbox Code Playgroud)

我很困惑,如何设置顶点着色器中的gl_FrontColor可以更改片段1中gl_Color的值?我错过了什么?

opengl shader pixel-shader vertex-shader

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

如何使用OpenGLES 2.0实时在libgdx中在背景上渲染Android的YUV-NV21相机图像?

与Android不同,我对GL/libgdx相对较新.我需要解决的任务,即将Android相机的YUV-NV21预览图像实时渲染到libgdx内部的屏幕背景是多方面的.以下是主要关注点:

  1. Android相机的预览图像仅保证在YUV-NV21空间中(在类似的YV12空间中,U和V通道不交错但分组).假设大多数现代设备提供隐式RGB转换是非常错误的,例如最新的Samsung Note 10.1 2014版本仅提供YUV格式.由于除非是RGB格式,否则无法在OpenGL中向屏幕绘制任何内容,因此必须以某种方式转换颜色空间.

  2. libgdx文档(集成libgdx和设备摄像头)中的示例使用Android表面视图,该视图低于使用GLES 1.1绘制图像的所有内容.自2014年3月初以来,由于过时而几乎所有设备都支持GLES 2.0,因此从libgdx中删除了OpenGLES 1.x支持.如果您使用GLES 2.0尝试相同的样本,则在图像上绘制的3D对象将是半透明的.由于背后的表面与GL无关,因此无法真正控制.禁用BLENDING/TRANSLUCENCY不起作用.因此,渲染此图像必须完全在GL中完成.

  3. 这必须是实时完成的,因此色彩空间转换必须非常快.使用Android位图的软件转换可能会太慢.

  4. 作为侧面功能,必须可以从Android代码访问摄像机图像,以执行除在屏幕上绘制之外的其他任务,例如通过JNI将其发送到本机图像处理器.

问题是,这项任务如何正确,尽可能快地完成?

shader camera android opengl-es-2.0 libgdx

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

开始着色器开发

我想开始使用微软的XNA进行一些游戏开发.部分原因是Shader开发,但我不知道如何开始.我知道nVidia的FX Composer是开发着色器的一个很好的工具,但我没有找到有关如何实际入门的有用和更新的内容.

你会推荐什么教程?

shader

19
推荐指数
2
解决办法
5446
查看次数

自iOS6以来,GLKTexture未正确映射

在我的3D对象上使用纹理时,我在Xcode 4.5和iOS 6 SDK中遇到了一个奇怪的行为.在针对OS X 10.8 SDK构建时,我的mac应用程序中也会出现此问题.

我在iOS上使用OpenGL ES 2.0,在OS X 10.8上使用OpenGL传统配置文件(<3.0).

纹理不再放置在正确的坐标处,我有很多工件.VAO正确上传,看起来很好,没有纹理.使用XCode 4.4.1和iOS 5.1 SDK时一切都很好.

VAO完全相同(使用OpenGL ES帧捕获检查),并且纹理制服绑定正确.


Xcode 4.4 VAO概述

Xcode 4.4

Xcode 4.5 VAO概述

Xcode 4.5

XCode 4.4.1(iOS 5.1 SDK)

iOS模拟器5.1 SDK

XCode 4.5(iOS 6 SDK)

iOS模拟器6.0 SDK


代码/着色器片段

用于上传和处理纹理的相关部分.我不得不将着色器剥离到minium.

顶点着色器

precision highp float;
attribute vec2 a_vTextureCoordinate;
uniform mat4 u_mModelViewMatrix;
uniform mat4 u_mModelViewMatrixInverse;
uniform mat4 u_mProjectionMatrix;
uniform mat4 u_mNormalMatrix;
void main()
{
....

    // Transform output position 
    gl_Position = u_mProjectionMatrix * u_mModelViewMatrix * a_vPosition;
    // Pass through texture coordinate v_texcoord = a_vTextureCoordinate.xy;
    v_vPosition = vec3(u_mModelViewMatrix * …
Run Code Online (Sandbox Code Playgroud)

shader opengl-es ios opengl-es-2.0 glkit

19
推荐指数
1
解决办法
679
查看次数

在OpenGL中使用间接渲染有什么好处?

我读过API之类的glDrawElementsIndirect,glDrawArraysIndirect帮助我们进行间接渲染.间接渲染不同于直接渲染参数,如"顶点属性数","绘制实例数","从缓冲区对象开始顶点属性"等由GPU本身在缓冲区对象中提供而不是直接渲染由绘图调用中的CPU提供.

我明白.它还解释了它的优点是它可以更快地渲染,因为不涉及CPU交互.但是等等,是不是实际进行渲染调用的CPU?它仍然指定了渲染模式(GL_TRIANGLES等).它也可能加载了顶点属性.

那么,间接渲染中的所有穿孔增益都是通过不必传递这些微小变量来解释的:"计数","原始计数","第一顶点属性","实例计数"?这对我来说没什么意义.(它也没有改变任何状态)

opengl shader opengl-es

19
推荐指数
2
解决办法
9283
查看次数