这是关于在Windows平台上构建简单的OpenGL ES 2.0程序所需步骤的非常具体的问题.环境是带有非托管C++的Visual Studio.
我去了Khronos.org网站,坦率地说,它发现它有点不透明,因为它看起来像标准机构写的东西.我不想下载"参考"或"规范"等.
所有我正在寻找的是从A到B的链接和步骤.换句话说,"下载这些文件或在此URL运行此设置.创建一个新的Visual Studio项目,引用这些库.包括此标题文件."
我再次对ES 2.0感兴趣.
我在尝试使用developer.android.com提供的GLES20示例时遇到"调用未实现的OpenGL ES API"错误.我修改了样本.原因是因为我在GLSurfaceView.BaseConfigChooser.chooseconfig中得到了IllegalArgumentException,所以我换了
mGLSurfaceView.setEGLContextClientVersion( 2 );
新的OnCreateMethod:
protected void onCreate( Bundle savedInstanceState )
{
super.onCreate( savedInstanceState );
mGLSurfaceView = new GLSurfaceView( this );
mGLSurfaceView.setEGLConfigChooser( new EGLConfigChooser()
{
@Override
public EGLConfig chooseConfig( EGL10 egl, EGLDisplay display )
{
EGLConfig[] configs = new EGLConfig[1];
int[] num_config = new int[1];
boolean check = false;
int[] configSpec = { EGL10.EGL_DEPTH_SIZE, 16, EGL10.EGL_NONE };
check = egl.eglInitialize( display, new int[] { 2, 0 } );
if ( !check )
return null;
check = false;
check …Run Code Online (Sandbox Code Playgroud) 我已经能够使用AVFoundation的AVAssetReader类将视频帧上传到OpenGL ES纹理中.但是,它有一个警告,因为当它与AVURLAsset指向远程媒体一起使用时会失败.这个失败没有很好的记录,我想知道是否有任何解决方法的缺点.
例如:
随意提及你认为很棒的任何其他工具:)
我正在尝试在WebGL中研究阴影贴图.我看到在各种库和实例中复制了相同的着色器代码.然而,我找不到它是如何工作的解释.
我们的想法是将深度值(单个浮点数)保存到颜色缓冲区(vec4)中.有一个pack函数可以将float保存到vec4和unpack函数,从vec4中检索float.
vec4 pack_depth(const in float depth)
{
const vec4 bit_shift = vec4(256.0*256.0*256.0, 256.0*256.0, 256.0, 1.0);
const vec4 bit_mask = vec4(0.0, 1.0/256.0, 1.0/256.0, 1.0/256.0);
vec4 res = fract(depth * bit_shift);
res -= res.xxyz * bit_mask;
return res;
}
float unpack_depth(const in vec4 rgba_depth)
{
const vec4 bit_shift = vec4(1.0/(256.0*256.0*256.0), 1.0/(256.0*256.0), 1.0/256.0, 1.0);
float depth = dot(rgba_depth, bit_shift);
return depth;
}
Run Code Online (Sandbox Code Playgroud)
我想象将一个浮动包装到vec4应该是一个微不足道的问题,只需将其复制到vec4的4个插槽中的一个并留下其他未使用的.这就是为什么上面代码中的位移逻辑让我感到困惑的原因.
任何人都能解释一下吗?

为了旋转/平移物体(仅绕z轴旋转和仅在xy平面上平移)不仅仅是wrt到全局中心(设备中心)而且还有其他任意点,我创建了一个算法,这是正确的(因为所有高级我已经讨论过的编码器认为它是正确的),但是在实现中删除不需要的翻译需要花费很多时间(算法是在8月4日创建的,并且是在同一天实现的,从那以后代码被修改了15次).
这是http://www.pixdip.com/opengles/transform.php#ALGO1的实现
产生不希望的翻译的代码行在里面:
private static void updateModel(int upDown, float xAngle, float yAngle, float zAngle) {
并列出如下:
Matrix.multiplyMV(GLES20Renderer._uBodyCentreMatrix, 0, GLES20Renderer._ModelMatrixBody, 0, GLES20Renderer._uBodyCentre, 0);
objX = GLES20Renderer._uBodyCentreMatrix[0];
objY = GLES20Renderer._uBodyCentreMatrix[1];
即使进行了以下更改,沿着+ Y的不期望的转换仍然存在:
objY = _uBodyCentreMatrix[1] - _uBodyCentre[1];
zAngle = 0;
ds = 0;
由于Renderer类的这些字段,-0.545867f每次调用时都会将值添加到Y坐标onDrawFrame():
private static final float[] _uBodyCentre = new float[]{-0.019683f, -0.545867f, -0.000409f, 1.0f};
protected static float[] _uBodyCentreMatrix = new float[4];
在http://www.pixdip.com/opengles/transform.php#FIELDS中
我需要帮助才能理解为什么不希望的翻译发生,转换的确切错误,或者算法是错误的.
万向锁可以成为一个问题吗?
请不要让我执行/练习更简单的示例,因为我准备了Renderer类来进行关于全局z轴的旋转/转换,而我所进入的这个新任务使用相同的类,稍作修改 updateModel()
(请注意,所需的旋转仅约为z轴,仅在xy平面内平移)
[API 10-> 15] …
在我的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.5 VAO概述

XCode 4.4.1(iOS 5.1 SDK)
XCode 4.5(iOS 6 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) 我正在使用opengl/egl为Android开发.我的应用程序需要第二个上下文来从第二个线程加载纹理.
我的代码在android 2.3上工作正常,但是当我在4.0.3 android设备或模拟器上尝试代码时,eglMakeCurrent()在EGL_BAD_MATCH中失败.
第二个上下文和它的像素缓冲区的初始化也都可以正常工作,所以我不知道从哪里开始寻找这个错误.
这是初始化代码:
ANativeWindow *window = (ANativeWindow*)displaySurface;
EGLint dummy, format;
display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
eglInitialize(display, 0, 0);
EGLint contextAttribs[] =
{
EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE
};
const EGLint configAttribs[] =
{
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_BLUE_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_RED_SIZE, 8,
EGL_ALPHA_SIZE, 8,
EGL_BUFFER_SIZE, 32,
EGL_DEPTH_SIZE, 24,
EGL_NONE
};
EGLint numConfigs;
EGLConfig config;
eglChooseConfig(display, configAttribs, &config, 1, &numConfigs);
eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);
ANativeWindow_setBuffersGeometry(window, 0, 0, format);
surface = eglCreateWindowSurface(display, config, window, NULL);
if(surface == NULL)
Trace("error creating window surface: …Run Code Online (Sandbox Code Playgroud) 我读过API之类的glDrawElementsIndirect,glDrawArraysIndirect帮助我们进行间接渲染.间接渲染不同于直接渲染参数,如"顶点属性数","绘制实例数","从缓冲区对象开始顶点属性"等由GPU本身在缓冲区对象中提供而不是直接渲染由绘图调用中的CPU提供.
我明白.它还解释了它的优点是它可以更快地渲染,因为不涉及CPU交互.但是等等,是不是实际进行渲染调用的CPU?它仍然指定了渲染模式(GL_TRIANGLES等).它也可能加载了顶点属性.
那么,间接渲染中的所有穿孔增益都是通过不必传递这些微小变量来解释的:"计数","原始计数","第一顶点属性","实例计数"?这对我来说没什么意义.(它也没有改变任何状态)
我正在寻找一种在WebGL中绘制更好质量(任意)文本的方法.目前我在2D画布上使用位图字体渲染并将它们放入WebGL上下文中.
此处描述了此方法http://delphic.me.uk/webgltext.html
这是我现在知道的在WebGL中绘制任意unicode文本的唯一解决方案.这种方法的问题是这些是位图字体,并且在较小的字体大小上看起来很块.我大多使用18的字体大小,与桌面质量字体相比,结果相当块.
我知道threeJS有一个字体库可以生成更好看的文本,但是我不想使用threeJS,因为我有自己的包装器,它可以正常工作,我不需要增加额外的三个开销.
那么如何在WebGL中创建更高质量的文本呢?有没有方法在Javascript中提取文本形状以提高质量?