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

使用以下着色器:
// 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),因此两个纹理都映射到视图中的相同坐标:

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

我想着色器内实现这一目标,而不是glBlendFunc和glBlendFuncSeparate,以我自己的值混合.
有没有办法在GLSL中实现这一目标?我有一种感觉,我将不同位置坐标的纹理顶点混合的方法被设计破坏了......
我正在尝试学习opengl es并遵循教程att android开发人员.第一个非常小的例子 - 他们说屏幕会变成灰色.当我复制这个例子并开始使用我的三星Galaxy SIII应用程序时 - 屏幕变为全黑色,并且顶部屏幕上的操作栏可以看到应用程序名称.所以 - 没有错误 - 除了动作栏之外,几乎覆盖整个屏幕的黑色.然后在开发者android的扩展示例中,应该绘制形状 - 完全相同的场景 - 只是一个黑屏 - 没有错误.
我想知道发生了什么.我仔细地按照教程
它的代码很多,可以在这里轻松下载
http://developer.android.com/training/graphics/opengl/environment.html#manifest
我创建了一个基于游戏模板的新项目,其中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) 我正在Android上的OpenGL ES 2.0中实现一个引擎.我有多个着色器,对象可以采用多个纹理.
我的目标是最小化对OpenGL的纹理绑定调用,因此我保留每个着色器的当前绑定纹理列表,并且仅glBindTexture()在纹理更改时调用.
例如,我有一个天空盒着色器,我只用它绘制一个对象(天空盒立方体),然后这个着色器在其生命周期中只需要一个纹理绑定.
当我绘制具有相同纹理的多个对象时,也可以获得收益.
我的症状是,如果我在绘制之前不重新绑定天空盒纹理,则在天空盒上使用不同的(先前绘制的)对象的纹理.此先前绘制的对象使用不同的着色器.
因此,当我再次使用着色器程序时,恢复纹理绑定是错误的吗?
ps.:我对天空盒使用单个2d纹理,而不是立方体贴图.
我有一个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) 我一直想知道GLSL sqrt(num)是否相等sqrt(abs(num)).这正是此函数在此着色器中的行为方式.我无法找到有关此行为的任何文档或参考.在这个着色器中,形成一个单位圆,并且sqrt对于圆的外部像素,内部值为负,但结果abs似乎在应用之前已经采用sqrt.
我正在使用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为我做伽马校正?如果有,怎么样?
否则,我想,我必须手动进行伽马校正.
我在使用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) 我是Android开发人员,但是OpenGL的初学者.我对视锥体感到困惑.有两个问题:
我不擅长英语,希望你能理解我的问题..任何帮助将不胜感激!
我正在尝试将实时效果应用于相机预览并在多个视图中显示,我该怎么办?
(就像相机2)(快照)
如果左侧没有ScrollView,我知道有两种方法可以显示相机预设的实时效果.
但是,我不知道如何使ScrollView与实时效果项叠加GLES组合.
在谷歌搜索和阅读漂亮的图形架构文章和Grafika项目后,我仍然不知道......
也许我想念一些重要的事情,有人指出我了吗?提前致谢.