有没有人熟悉某种OpenGL 魔法来摆脱在片段着色器中计算一堆像素而不是只有 1 个?尤其是这个问题对于 OpenGL ES 来说很热门,实际上这意味着移动平台的缺陷,并且需要以更准确(在性能意义上)的方式来处理它。
有什么结论或想法吗?
PS,由于 GPU 架构组织,它是已知的着色器,它为每个纹理 monad 并行运行。但也许有技术可以将它从一个像素提升到一组像素,或者实现您自己的 glTexture 组织。通过这种方式,可以在 GPU 中更快地完成很多工作。
我正在阅读 android OpenGL ES 教程,我明白我必须实现我的渲染器(链接到教程)。
我试图在 Mono for Android 中复制这个,所以我假设我必须实现的接口是GLSurfaceView.IRenderer,但是这个接口实现了Android.Runtime.IJavaObject,这需要IntPtr Handle { get; }.
教程没有提到这个,因为这个问题在java中显然不存在。
我怎样才能实现这个属性?或者是否有更直接的方式在 Mono for Android 中使用 OpenGL ES?
我无法将 sampler2d 统一从我的代码传递到着色器。我的着色器中有这一行:
uniform sampler2D u_texture;
Run Code Online (Sandbox Code Playgroud)
在代码中,我使用在搅拌机中创建的 g3db 模型(带纹理):
AssetManager assets = new AssetManager();
assets.load(data+"/earth.g3db", Model.class);
assets.finishLoading();
Model earthModel = assets.get(data+"/earth.g3db", Model.class);
earthPlanet = new ModelInstance(earthModel,0,-1,0);
Run Code Online (Sandbox Code Playgroud)
我使用modelBatch渲染它:
modelBatch.begin(cam);
modelBatch.render(earthPlanet, shader);
modelBatch.end();
Run Code Online (Sandbox Code Playgroud)
我的代码中有着色器类,其中有一个渲染方法:
public void render(Renderable renderable) {
program.setUniformMatrix(u_worldTrans, renderable.worldTransform);
//how to pass texture??
//program.setUniformf(sampler2D, ????);
renderable.mesh.render(program,
renderable.primitiveType,
renderable.meshPartOffset,
renderable.meshPartSize);
}
Run Code Online (Sandbox Code Playgroud)
我会很高兴得到任何回应。谢谢!
我有点沮丧。我即将使用 mac(OS X 小牛)进行编码。
我的着色器在 windows 7 和 android 下运行良好。当我在 OS X 下运行我的应用程序时,我在运行时遇到以下编译器错误。
Exception in thread "LWJGL Application" java.lang.IllegalStateException: ERROR: 0:6: Initializer not allowed
ERROR: 0:6: Use of undeclared identifier 'light'
ERROR: 0:6: Use of undeclared identifier 'spec'
ERROR: 0:6: Use of undeclared identifier 'spec'
ERROR: 0:6: Use of undeclared identifier 'spec'
Run Code Online (Sandbox Code Playgroud)
片段着色器片段:
String fragmentShader =
"#ifdef GL_ES\n" +
"precision mediump float;\n" +
"#endif\n" +
"uniform sampler2D cubeMap;\n"+
"uniform sampler2D normalMap;"+
"varying vec2 v_TexCoords;"+
"void main() {\n"+
" const vec4 …Run Code Online (Sandbox Code Playgroud) 我正在尝试运行 android 示例http://developer.android.com/training/graphics/opengl/index.html
我必须在视图中添加一些控件,如文本和按钮,它们看起来像 
如何在 Android 布局中使用 GLSurfaceView?
主要活动(跳过一些自动生成的代码)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mGLSurfaceView = (myGLSurfaceView) findViewById(R.id.glSurfaceViewID); //crashes
}
Run Code Online (Sandbox Code Playgroud)
表面视图
public class myGLSurfaceView extends GLSurfaceView {
private myRenderer mRenderer;
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
return super.onTouchEvent(event);
}
public myGLSurfaceView (Context context) {
super(context);
// Create an OpenGL ES 2.0 context.
setEGLContextClientVersion(2);
// Creating a Renderer
setRenderer(new myRenderer(context));
// Render the view only when there is a change in …Run Code Online (Sandbox Code Playgroud) 是否可以仅使用一组格式化为 GL_TRIANGLE_STRIP 的数组缓冲区数据来分隔/断开线路。基本上,我在 2D 正射投影中在视口上有一堆垂直线。每条线是 2 个三角形(因此三角形带有 4 个顶点)。有一条对角线连接到下一条线,这是不可取的。
我是否坚持更改为 GL_TRIANGLES 或将条带分离成单独的数组?
我通过这本书一步一步地学习了 WebGL 。我尝试通过使用缓冲区 ( gl.ARRAY_BUFFER) 而不是循环来绘制三个点(正如我之前在本书的其他示例中所做的那样)。
var u_FragColor = gl.getUniformLocation(gl.program, 'u_FragColor');
if(!u_FragColor){
console.log('Can\'t to get the "u_FragColor" variable.');
return -1;
}
// gl.uniform1f(u_FragColor, 1.0); // <- this variant doesn't work! Why?
gl.uniform4f(u_FragColor, 1.0, 0.0, 0.0, 1.0);
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我有一个关于gl_FragColor初始化的问题:为什么我不能替换
gl.uniform4f(u_FragColor, 1.0, 0.0, 0.0, 1.0);
Run Code Online (Sandbox Code Playgroud)
在
gl.uniform1f(u_FragColor, 1.0);
Run Code Online (Sandbox Code Playgroud)
? 我预计这是一样的。但是在这种情况下,我在控制台中收到错误消息:

我正在使用 GLES 2.0 ( http://maninara.blogspot.com/2012/09/render-camera-preview-using-opengl-es.html )渲染相机预览。它工作得很好,直到我从其他地方复制了一些 GLSL 着色器代码并注意到它不起作用并且我收到此错误:
error C7502: OpenGL does not allow type suffix 'f' on constant literals in versions below 120
Run Code Online (Sandbox Code Playgroud)
因此,要查看问题是否出自我复制的着色器代码,我将顶点着色器示例(请参见上面的链接)中的这一行从
gl_Position = vec4 ( vPosition.x, vPosition.y, 0.0, 1.0 )
Run Code Online (Sandbox Code Playgroud)
到
gl_Position = vec4 ( vPosition.x, vPosition.y, 0.0f, 1.0f )
Run Code Online (Sandbox Code Playgroud)
但我仍然遇到同样的错误。我已经通过输出 GLES20.glGetString(GLES20.GL_SHADING_LANGUAGE_VERSION) 来确认 GLSL 的版本足够高,它给出:
GLSL Version = OpenGL ES GLSL ES 3.10
Run Code Online (Sandbox Code Playgroud)
我是否错误地设置了 OpenGL ES 上下文?这里发生了什么?
更新:如果我添加“#version 120”,我会收到这个错误:
error C0201: unsupported version 120
Run Code Online (Sandbox Code Playgroud) 我使用 Android NDK 和 FreeImage 库编写游戏以将图像加载到我的游戏中。它以 BGR 格式加载图像。可以以RGB格式加载吗?或者我需要手动交换 R 和 B 组件?
已编辑
我的设备是三星 Galaxy S4(armv7 架构)。这是代码`
FIMEMORY* fiStream = FreeImage_OpenMemory((BYTE*)data, size);
FREE_IMAGE_FORMAT fif = FreeImage_GetFileTypeFromMemory(fiStream);
if (FreeImage_FIFSupportsReading(fif))
{
dib = FreeImage_LoadFromMemory(fif, fiStream, 0);
}
if (!dib)
return;
data_ = FreeImage_GetBits(dib);
width_ = FreeImage_GetWidth(dib);
height_ = FreeImage_GetHeight(dib);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width_, height_, 0, GL_RGB, GL_UNSIGNED_BYTE, data_ );
Run Code Online (Sandbox Code Playgroud) 注意我是 Android 和 OpenGL 的新手。
我使用代码在屏幕上显示 Android 相机预览。我想在下面的“MainRenderer”类中使用 OpenGL 2.0(以匹配我的相机的纵向分辨率,因为我的应用程序处于纵向模式)将相机角度旋转 90 度。我已经研究过Android 相机旋转,但它没有执行旋转。
在布局 xml 中设置“android:rotation='90'”会旋转表面视图但会产生黑色表面 - 没有相机预览。
由于我使用 GLSurfaceView,我现在希望通过执行矩阵旋转和纵横比调整来实际旋转 OpenGL 2.0 中的相机预览。像如何在 OpenGL 2.0 ES 和http://www.programcreek.com/java-api-examples/index.php?class=android.opengl.Matrix&method=rotateM 中旋转相机视图这样的帖子很少 , 但我无法联系由于我不熟悉 OpenGL(我希望很快熟悉),因此使用以下代码的 API。
我知道也许rotateM 和translateM(猜测使用ModelViewProjection Matrix)可能会做我打算完成的事情。
我想知道下面可能需要更改 vtmp 和 ttmp 吗?
任何帮助表示赞赏。
原始代码来自http://maninara.blogspot.com/2012/09/render-camera-preview-using-opengl-es.html
// 在清单中
< uses-feature android:glEsVersion="0x00020000" android:required="true"/>
< uses-feature android:name="android.hardware.camera"/>
< uses-permission android:name="android.permission.CAMERA"/>
< uses-permission android:name="android.permission.WAKE_LOCK"/>
... android:screenOrientation="landscape" ... // activity property
Run Code Online (Sandbox Code Playgroud)
// 活动
public class MainActivity extends Activity {
private …Run Code Online (Sandbox Code Playgroud)