标签: opengl-es

在GLSL中混合不同大小/坐标的纹理

如果在片段着色器中混合两个不同大小的纹理,是否可以将纹理映射到不同的坐标?

例如,如果混合以下两个图像中的纹理:

黑白面具图像 马特宏峰图像

使用以下着色器:

      // Vertex shader
      uniform mat4 uMVPMatrix;
      attribute vec4 vPosition;
      attribute vec2 aTexcoord;
      varying vec2 vTexcoord;
      void main() {
        gl_Position = uMVPMatrix * vPosition;
        vTexcoord = aTexcoord;
      }

      // Fragment shader
      uniform sampler2D uContTexSampler;
      uniform sampler2D uMaskTextSampler;
      varying vec2 vTexcoord;
      void main() {
        vec4 mask = texture2D(uMaskTextSampler, vTexcoord);
        vec4 text = texture2D(uContTexSampler, vTexcoord);
        gl_FragColor = vec4(text.r * mask.r), text.g * mask.r, text.b * mask.r, text.a * mask.r); 
      }
Run Code Online (Sandbox Code Playgroud)

(片段着色器用第二个纹理替换黑色和白色蒙版的白色空格).

由于两个纹理都使用相同的gl_Position和坐标(1.0f,1.0f,1.0f,0.0f,0.0f,1.0f,0.0f,0.0f),因此两个纹理都映射到视图中的相同坐标:

在此输入图像描述

但是,我的目标是保持原始纹理比例:

在此输入图像描述

我想着色器内实现这一目标,而不是glBlendFuncglBlendFuncSeparate,以我自己的值混合.

有没有办法在GLSL中实现这一目标?我有一种感觉,我将不同位置坐标的纹理顶点混合的方法被设计破坏了......

android blending opengl-es opengl-es-2.0

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

开发人员android OPENGL ES教程 - 黑屏

我正在尝试学习opengl es并遵循教程att android开发人员.第一个非常小的例子 - 他们说屏幕会变成灰色.当我复制这个例子并开始使用我的三星Galaxy SIII应用程序时 - 屏幕变为全黑色,并且顶部屏幕上的操作栏可以看到应用程序名称.所以 - 没有错误 - 除了动作栏之外,几乎覆盖整个屏幕的黑色.然后在开发者android的扩展示例中,应该绘制形状 - 完全相同的场景 - 只是一个黑屏 - 没有错误.

我想知道发生了什么.我仔细地按照教程

它的代码很多,可以在这里轻松下载

http://developer.android.com/training/graphics/opengl/environment.html#manifest

android opengl-es opengl-es-2.0

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

为什么iOS 8上的SceneKit无法编译我的自定义着色器?

我创建了一个基于游戏模板的新项目,其中SceneKit作为游戏技术,Swift作为语言.我尝试使用自定义着色器.这是设置代码:

var material = SCNMaterial()
var program = SCNProgram()

// Read the vertex shader file and set its content as our vertex shader
if let vertexShaderPath = NSBundle.mainBundle().pathForResource("VertexShader", ofType:"vsh") {
    let vertexShaderAsAString = NSString(contentsOfFile: vertexShaderPath, encoding: NSUTF8StringEncoding, error: nil)
    program.vertexShader = vertexShaderAsAString
}

// Read the fragment shader file and set its content as our fragment shader
if let fragmentShaderPath = NSBundle.mainBundle().pathForResource("FragmentShader", ofType:"fsh") {
    let fragmentShaderAsAString = NSString(contentsOfFile: fragmentShaderPath, encoding: NSUTF8StringEncoding, error: nil)
    program.fragmentShader = fragmentShaderAsAString
}

// Give a …
Run Code Online (Sandbox Code Playgroud)

opengl-es fragment-shader ios scenekit swift

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

glUseProgram之间的OpenGL纹理绑定

我正在Android上的OpenGL ES 2.0中实现一个引擎.我有多个着色器,对象可以采用多个纹理.

我的目标是最小化对OpenGL的纹理绑定调用,因此我保留每个着色器的当前绑定纹理列表,并且仅glBindTexture()在纹理更改时调用.

例如,我有一个天空盒着色器,我只用它绘制一个对象(天空盒立方体),然后这个着色器在其生命周期中只需要一个纹理绑定.

当我绘制具有相同纹理的多个对象时,也可以获得收益.

我的症状是,如果我在绘制之前不重新绑定天空盒纹理,则在天空盒上使用不同的(先前绘制的)对象的纹理.此先前绘制的对象使用不同的着色器.

因此,当我再次使用着色器程序时,恢复纹理绑定是错误的吗?

ps.:我对天空盒使用单个2d纹理,而不是立方体贴图.

android opengl-es

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

在纹理的SceneKit绘画与纹理坐标

我有一个Collada模型,我加载到SceneKit.当我在模型上执行hittest时,我能够检索被击中的模型的纹理坐标.

使用这些纹理坐标,我应该能够用颜色替换纹理坐标.所以这种方式我应该可以在模型上绘制

如果我错了,请纠正我.

到目前为止我读了很多文章,但我没有把我的着色器弄好.(虽然我确实得到了一些时髦的效果;-)

我的顶点着色器:

precision highp float;

attribute vec4 position;
attribute vec2 textureCoordinate;
attribute vec2 aTexureCoordForColor; //coordinates from the hittest

uniform mat4 modelViewProjection;

varying vec2 aTexureCoordForColorVarying; // passing to the fragment shader here
varying vec2 texCoord;

void main(void) {
    // Pass along to the fragment shader
    texCoord = textureCoordinate;
    aTexureCoordForColorVarying = aTexureCoordForColor; //assigning here
    // output the projected position
    gl_Position = modelViewProjection * position;
}
Run Code Online (Sandbox Code Playgroud)

我的片段着色器

precision highp float;

uniform sampler2D yourTexture;

uniform vec2 uResolution;
uniform int uTexureCoordsCount;

varying …
Run Code Online (Sandbox Code Playgroud)

shader opengl-es glsl scenekit ios8

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

`sqrt`如何表现GLSL中的负值?

我一直想知道GLSL sqrt(num)是否相等sqrt(abs(num)).这正是此函数在此着色器中的行为方式.我无法找到有关此行为的任何文档或参考.在这个着色器中,形成一个单位圆,并且sqrt对于圆的外部像素,内部值为负,但结果abs似乎在应用之前已经采用sqrt.

opengl opengl-es glsl

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

OpenGL ES 3.0上的sRGB Framebuffer

我正在使用Java开发OpenGL ES 3.0 Android项目.我需要实现伽马校正,并且在某处我已经读过,在OpenGL ES 3.0中将支持sRGB纹理.所以我的目的是在渲染到默认的帧缓冲区之前调用glEnable(GL_FRAMEBUFFER_SRGB).

但是,当我试着打电话的时候

GLES30.glEnable(GLES30.GL_FRAMEBUFFER_SRGB)
Run Code Online (Sandbox Code Playgroud)

事实证明,没有GLES30.GL_FRAMEBUFFER_SRGB,但是有一些常量用于sRGB纹理格式,如GLES30.GL_SRGB.

所以,我的问题是:是否可以让OpenGL ES 3.0为我做伽马校正?如果有,怎么样?

否则,我想,我必须手动进行伽马校正.

java android opengl-es srgb opengl-es-3.0

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

绘制到不同大小的FBO

我在使用FBO时遇到了问题.

我的窗口大小是1200x300.

当我创建一个1200x300的FBO时,一切都很好.

但是,当我创建尺寸为2400x600的FBO(实际上,两个轴上的两倍大)并尝试渲染完全相同的基元时,我只使用了FBO实际区域的四分之一.

FBO与窗口大小相同:

大小相同

FBO两倍大(可以注意到三角形剪裁):

大小不同

我将这两个三角形渲染成FBO,然后渲染一个全屏四边形,其上有一个FBO纹理.我用这种松绿色清除FBO,所以我确定第二张照片上的所有空白空间实际上来自FBO.

// init() of the program
albedo = new RenderTarget(2400, 600, 24 /*depth*/);  // in first case, params are 1200, 300, 24

// draw()
RenderTarget::set(albedo);   // render to fbo
RenderTarget::clearColor(0.0f, 0.3f, 0.3f, 1.0f);
RenderTarget::clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

// render triangles ...
glDrawArrays(GL_TRIANGLES, 0, 6);

// now it's time to render a fullscreen quad
RenderTarget::set();   // render to back-buffer
RenderTarget::clearColor(0.3f, 0.0f, 0.0f, 1.0f);
RenderTarget::clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, albedo->texture());
glUniform1i(albedoUnifLoc, 0);
RenderTarget::drawFSQ();   // draw fullscreen quad …
Run Code Online (Sandbox Code Playgroud)

opengl fbo opengl-es render-to-texture

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

在Opengl中,近平面和Image平面是一样的吗?

我是Android开发人员,但是OpenGL的初学者.我对视锥体感到困惑.有两个问题:

  1. 靠近飞机和画面的东西是一样的吗?
  2. 如果它们不是同一个东西,为什么没有指定图像平面的z值?

我不擅长英语,希望你能理解我的问题..任何帮助将不胜感激!

opengl opengl-es

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

SurfaceView或TextureView组合

我正在尝试将实时效果应用于相机预览并在多个视图中显示,我该怎么办?
(就像相机2)(快照)

如果左侧没有ScrollView,我知道有两种方法可以显示相机预设的实时效果.

  • 使用GLSurfaceViewsetRenderer.将SurfaceTexture绑定为GLES外部纹理,并使用GLSL(OpenGL着色语言)来应用效果.
  • 使用TextureView.它更复杂,因为需要设置EGLContext/EGLSurface并进行线程管理.

但是,我不知道如何使ScrollView与实时效果项叠加GLES组合.

  1. 我应该选择GLSurfaceView(用于性能)还是TextureView(用于flexble)来实现ScrollView?哪一个更好的解决方案,为什么?
  2. 是否可以在多个视图之间共享一个EGL上下文/表面?如果是,任何代码片段都可以引用?

在谷歌搜索和阅读漂亮的图形架构文章和Grafika项目后,我仍然不知道......
也许我想念一些重要的事情,有人指出我了吗?提前致谢.

android opengl-es surfaceview glsurfaceview textureview

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