我在这里真的很绝望.我正在使用Xcode,尝试在iPhone上实现一些OpenGL内容.我必须为Phong-Lighting写一个Shader.我得到了声明我的几何(顶点,索引,计算等)并将相应的参数作为属性传递给着色器(用GLSL编写).使用这些属性可以正常工作,一些非常基本的着色器程序可以正确编译并提供预期的输出.
现在我试着从一些更先进的计算开始,为此我需要使用GLSL的一些内置属性,即"gl_NormalMatrix",但每当我尝试时,程序崩溃,我得到一个"错误:0:3:使用未声明的标识符'gl_NormalMatrix'".每当使用任何内置属性(如gl_Vertex,gl_Normal等)时,它都会发生相同的情况.
这些属性在iPhone上的GLSL中是不可用的,还是我遗漏了什么?也许我还没有完全理解这是如何工作的.如上所述,将我自己的顶点属性传递到着色器工作正常,我也想知道程序应该如何"自己""知道"正确的值 - 所以内置属性的整个概念仍然有点令人困惑我.但每当我尝试运行一些着色器时,我发现在线查看是否有事情发生,我会抛出这些错误,即使其他人似乎在编写着色器时也广泛使用内置属性.
我真的希望有人能够对此有所了解.提前多谢!
朱莉娅
我有一个使用OpenGL ES进行渲染的游戏.它需要我在恢复应用程序时重新加载所有纹理.当我按下homekey并退出(暂停应用程序)然后恢复它时,它工作正常.但是,当我使用电源键关闭屏幕然后打开屏幕时,应用程序将自动恢复锁定屏幕(滑动解锁屏幕).无论如何我可以避免这种情况吗?因为简历不合适,如果我在稍微延迟(10秒)后解锁屏幕,游戏将重新加载,我最终看到的只是一个白屏.我想主要是,如果我可以阻止应用程序在锁定屏幕恢复.我希望在解锁屏幕后恢复应用程序.
谢谢阿卡什
当我从我正在显示谷歌地图的网页视图切换到另一个视图时,偶尔只会偶然关闭我的应用程序(没有强制关闭对话框,只需关闭).我在logcat中收到此错误:
E/libEGL(29103):调用没有当前上下文的OpenGL ES API(每个线程记录一次)
有任何想法吗?
我有一个mainActivity,它为每个页面使用不同的"视图".以下是main中用于调用视图的代码:
private void changeCardDisplayed(int index) {
// Log.i(DEBUG_TAG, "changeCardDisplay index is " + index);
if (mCardLayout != null){
mCardLayout.destroy();
} else {
mCardLayout = new CardLayout(this);
}
if (mMapView != null) mMapView.destroy();
mCardLayout = null;
mMapView = null;
mCardContainer.removeAllViews();
mMapsContainer.removeAllViews();
if (mWD != null) {
mAdView.makeAdRequest(mWD.cityId, mWD.iconCode);
}
System.gc();
switch (index) {
case ACCUWX.Views.CURRENT_VIEW:
mCardLayout = new CurrentView(this);
break;
case ACCUWX.Views.FORECAST_VIEW:
mCardLayout = new ForecastView(this);
break;
case ACCUWX.Views.HOURLY_VIEW:
mCardLayout = new HourlyListView(this);
break;
case ACCUWX.Views.LIFESTYLE_VIEW: …Run Code Online (Sandbox Code Playgroud) 我正在使用AndEngine(基于2D OpenGL的引擎).当我使用具有透明度的纹理(PNG图像)时,我在图像上的边框上有图像伪像.我需要帮助解决这个问题.我附上了2张图片.首先,我只使用某种字体显示文本.在第二个,您可以看到圆角,但在纹理的角落,您也可以看到工件.请注意,这仅在REAL设备上发生.在模拟器上一切都OK.我的设备是三星i5700 Galaxy Spica运行Android 2.1
角落与神器http://i44.tinypic.com/2crttlx.png 文本与神器http://i39.tinypic.com/10r4yn9.png
我正在尝试在webgl中使用多个着色器程序,但仍然会遇到问题.
似乎如果我在程序中有不同数量的顶点着色器属性,那么我没有得到任何没有错误的渲染.是否有一些约束意味着程序必须具有相同数量的属性?更改程序时是否需要禁用/启用属性位置?
似乎只是创建多个程序导致问题(我甚至不必使用第二个着色器,只是它被创建的事实导致问题).
要创建属性,我正在使用以下代码段(当所有程序中的属性数相同时,工作正常):
for ( var i=0 ; i<vertexAttributes.length ; i++ )
{
shaderProgram[vertexAttributes[i].name] = gl.getAttribLocation(shaderProgram,vertexAttributes[i].name);
gl.enableVertexAttribArray(shaderProgram[vertexAttributes[i].name]);
}
Run Code Online (Sandbox Code Playgroud)
很抱歉发布了如此大量的代码,但这最能说明问题所在.这是来自learningwebgl.com教程之一的代码,我所做的就是添加第二对着色器("shader2-fs"和"shader2-vs")和一个名为initShaders2的新函数.如果在webGLStart()中调用initShaders2(因为它在代码中),那么什么都没有被绘制?我很困惑!
<script type="text/javascript" src="two_files/glMatrix-0.js"></script>
<script type="text/javascript" src="two_files/webgl-utils.js"></script>
<script id="shader-fs" type="x-shader/x-fragment">
precision mediump float;
varying vec4 vColor;
void main(void) {
gl_FragColor = vColor;
}
</script>
<script id="shader-vs" type="x-shader/x-vertex">
attribute vec3 aVertexPosition;
attribute vec4 aVertexColor;
uniform mat4 uMVMatrix;
uniform mat4 uPMatrix;
varying vec4 vColor;
void main(void) {
gl_Position = uPMatrix * uMVMatrix * vec4(aVertexPosition, 1.0);
vColor = aVertexColor;
}
</script>
<script id="shader2-fs" type="x-shader/x-fragment"> …Run Code Online (Sandbox Code Playgroud) private Texture druidTexture;
private SpriteBatch batch;
Sprite sprite;
@Override
public void create() {
druidTexture = new Texture(Gdx.files.internal("star-large.gif"));
sprite = new Sprite(druidTexture);
batch = new SpriteBatch();
}
@Override
public void dispose() {
}
@Override
public void pause() {
}
@Override
public void render() {
batch.begin();
sprite.rotate(45);
float x=sprite.getX();
float y=sprite.getY();
float newx=x+1;
System.out.println(newx);
float newy=y+1;
sprite.setX(newx);
sprite.draw(batch);
batch.end();
}
@Override
public void resize(int arg0, int arg1) {
}
@Override
public void resume() {
}
}
Run Code Online (Sandbox Code Playgroud)
我正在获取上述代码的输出

但是我需要移除后面的星星,对于每个星星,我该怎么办?
我需要做出如何处理需要在图像纹理上渲染少量3D对象的应用程序的设计决策.结果需要呈现并保存为UIImage.图形设计(客户端)期望标准UIKit控件操纵3D世界.
OpenGL视图(CAEAGLLayer层)需要在UIScrollView内部进行廉价和自然的滚动和缩放实现.只有很少的额外控制来操纵旋转比例和几个3D对象的过渡.预期的三角形数量不多(最多100-200个)和2-3个纹理(1个模板).它甚至不必经常刷新,只是在某些变换和缩放发生变化时.CAEAGLLayer不需要是不透明的.
我会选择Core Animation解决方案,但不支持将3D转换的CALayers渲染为CGContextRef(也不支持屏蔽).
将CAEAGLLayer放入UIScrollView并将其与少量UIKit视图混合时,实际性能成本是多少?我可以期望以平滑的帧速率(每秒30fps)呈现每秒多少三角形,这样我可以做出最好的决定吗?
我知道已有类似的问题,但没有一个答案提供具体的数字,这可能有助于估计预期的渲染结果.
在我的opengl片段中添加一个float属性时(我想稍后找到它),当我编译时,我得到:
ERROR: 0:1: Invalid qualifiers 'attribute' in global variable context
Run Code Online (Sandbox Code Playgroud)
这是我的代码:
const char * sChromaKeyFragment = _STRINGIFY(
attribute float threshold;
varying highp vec2 coordinate;
precision mediump float;
uniform sampler2D videoframe;
uniform sampler2D videosprite;
uniform vec4 mask;
vec3 normalize(vec3 color, float meanr)
{
return color*vec3(0.75 + meanr, 1., 1. - meanr);
}
void main()
{
}
Run Code Online (Sandbox Code Playgroud)
OpenGL新手.任何帮助都会很棒.谢谢!
我有这个代码:
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
GLES20.glClearColor(0, 0, 0, 1.0f);
int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER,
getVertexShader());
int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER,
getFragmentShader());
mProgram = GLES20.glCreateProgram();
GLES20.glAttachShader(mProgram, vertexShader);
GLES20.glAttachShader(mProgram, fragmentShader);
GLES20.glLinkProgram(mProgram);
Matrix.setIdentityM(mMMatrix, 0);
**maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");**
}
Run Code Online (Sandbox Code Playgroud)
在标记的行之后,由于某种原因,maPositionHandle为-1.
这是我的vert着色器:
uniform mat4 uTMatrix;
uniform mat4 uMVPMatrix;
attribute vec4 aPosition;
attribute vec2 aTextureCoord;
varying vec2 vTextureCoord;
void main() {
gl_Position = uMVPMatrix * uTMatrix * gl_Position;
vTextureCoord = aTextureCoord;
}
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,有一个名为aPosition的属性,但我得到了-1,我在屏幕上没有得到绘图输出.我该如何解决?谢谢.
我设置了我的场景(Android应用程序,OpenGL ES),如下所示:
GLU.gluPerspective(gl, 60, viewRatio, 0.1f, 1000.0f);
// ...
GLU.gluLookAt(gl, cameraX, cameraY, cameraZ, cameraX, cameraY, cameraZ - 1f, 0f, 1f, 0f);
// Scene scaled down because object positions are in [-10000..10000] for x & y
gl.glScalef(0.001f, 0.001f, 1.0f);
Run Code Online (Sandbox Code Playgroud)
场景渲染得很好,它包含z = -10处的四边形和z = -30处的一个巨型背景四边形.我现在正在尝试实现光线拾取,就像这样(取自这个线程:
public float[] unproject(float rx, float ry, float rz) {
float[] xyzw = {0, 0, 0, 0};
int[] viewport = {0, 0, mDisplayWidth, mDisplayHeight};
android.opengl.GLU.gluUnProject(rx, ry, rz, mMatrixGrabber.mModelView, 0, mMatrixGrabber.mProjection, 0, viewport, 0, xyzw, 0);
xyzw[0] …Run Code Online (Sandbox Code Playgroud) opengl-es ×10
android ×6
glsl ×3
iphone ×3
ios ×2
andengine ×1
java ×1
javascript ×1
libgdx ×1
ray-picking ×1
shader ×1
uikit ×1
uiscrollview ×1
webgl ×1