当我使用XNA时,模型格式很明显.X或.FBX,它们有骨头所以我能够进行动画和碰撞检测,它们可能拥有我需要的一切.但现在我开始使用Android和OpenGL ES,我似乎无法找到任何关于首选模型格式的东西,我一直看到.OBJ但它们不支持骨头,我也读过一些关于collada和md5格式的东西但是听到了加载它们有些问题吗?还有min3d的建议,但我不喜欢使用第三方的东西.
有人可以解释模型和OpenGL ES的情况,为什么没有首选的明显选择(至少从我的角度来看),我应该采用什么格式或解决方案?
这也是我的第一个问题,如果我没有正确解释自己或者提出任何其他问题错误,请写下建议.
我想做一个mmorpg游戏,我想在开始之前知道一些事情
,首先,我知道如何为Android制作游戏,我一直在使用canvas,opengl es 1.0/1.1和一些andengine(也是opengl) es 1.0/1.1).我想知道我应该使用什么来获得一个好的可靠和快速的mmorpg,还有其他选择可以获得更好的性能吗?
该游戏目前只针对Android,我使用android sdk和eclipse来编程我的游戏.
另外,我在哪里可以学习如何制作合适的客户端和服务器?因为我从未有过这方面的经验.直到现在我只制作了2d和一些3D游戏,其中没有一个在线或任何类型的mmo.
如果需要,我也有一些网站开发的sql和php经验.我和PhpMyAdmin合作过我的网站.
谢谢!
我正在尝试使用android opengl绘制一个矩形.矩形将在彩色背景中形成.运行代码后,我可以看到背景但内部没有矩形.
public void onDrawFrame(GL10 gl)
{
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glClearColor(0.4f, 0.5f, 0.6f, 0.5f);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
float[] vertices=
{
-1.0f, 1.0f, 0.0f,
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
1.0f, 1.0f, 0.0f,
};
short[] indices = { 0, 1, 2, 0, 2, 3 };
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
vbb.order(ByteOrder.nativeOrder());
FloatBuffer vertexBuffer = vbb.asFloatBuffer();
vertexBuffer.put(vertices);
vertexBuffer.position(0);
ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * 2);
ibb.order(ByteOrder.nativeOrder());
ShortBuffer indexBuffer = ibb.asShortBuffer();
indexBuffer.put(indices);
indexBuffer.position(0);
gl.glFrontFace(GL10.GL_CCW);
gl.glEnable(GL10.GL_CULL_FACE);
gl.glCullFace(GL10.GL_BACK);
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glColor4f(0.5f, 0.3f, 0.3f, 0.7f);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); …Run Code Online (Sandbox Code Playgroud) 我的引擎中有多个纹理后遇到问题.
我的渲染代码目前看起来像这样:
void Renderer::render() {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
checkGlError("glClear");
for (vector<Node*>::const_iterator it = renderArray_.begin(); it != renderArray_.end();
it++) {
Node* node = *it;
EntityModel* entity =
static_cast<EntityModel*>(resourceManager_->getResource(
(*it)->getEntity()));
if (entity == 0 || entity->getVertices() == 0 || entity->getVertices()->size() == 0) {
LOGI("Empty entity %s.", node->getName().c_str());
continue;
}
Resource* resource = resourceManager_->getResource(node->getShader());
Shader* shader = static_cast<Shader*>(resource);
Resource* resource2 = resourceManager_->getResource(entity->getTexture());
Image* image = static_cast<Image*>(resource2);
mat4 proj;
Matrix::projection3D(proj, 45.0f,
(float) nScreenWidth_ / nScreenHeight_, 0.1f, 100.0f);
mat4 res;
Matrix::multiply(proj, node->getMatrix(), res);
// Select …Run Code Online (Sandbox Code Playgroud) 将纹理渲染为矩形(2个三),其中:
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,
GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER,
GLES20.GL_NEAREST);
Run Code Online (Sandbox Code Playgroud)
没问题 但我不希望纹理被拉伸,所以我试图改为:
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,
GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,
GLES20.GL_CLAMP_TO_EDGE);
Run Code Online (Sandbox Code Playgroud)
但我得到的一切都是黑屏.
有没有简单的方法来避免纹理适应屏幕保持比例?
这是我加载纹理的地方
public static int loadTexture(final Context context, Bitmap bitmap)
{
final int[] textureHandle = new int[1];
GLES20.glGenTextures(1, textureHandle, 0);
if (textureHandle[0] != 0)
{
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false; // No pre-scaling
// Read in the resource
//final Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resourceId, options);
// Bind to the texture in OpenGL
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]);
// Set filtering
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); …Run Code Online (Sandbox Code Playgroud) 这是我用来飞过我的精灵表的方法.在对象类中,我跟踪信息并进行所有循环,这基本上只需要分配纹理映射坐标.只是它似乎没有工作.但我记录了我翻转行/列的方式,它正确循环.但就纹理而言,我什么都看不到.一点都不 我错过了什么吗?
public void SetToAnimatedTexture(int NumFramesWide, int NumFramesTall, int CurrentRow, int CurrentColumn) {
/*****************************************************************************************
* This Assembles our Vertices in the correct spots by disassembling
* our custom rectangles corners, and adds animation. Call this after creating the meshRect
* *****************************************************************************************/
float frameWidth = 1/NumFramesWide;
float frameHeight = 1/NumFramesTall;
float u1 = frameWidth*CurrentColumn;
float u2 = (frameWidth*CurrentColumn) + frameWidth;
float u3 = (frameWidth*CurrentColumn) + frameWidth;
float u4 = frameWidth*CurrentColumn;
float v1 = (frameHeight*CurrentRow) + frameHeight;
float v2 = (frameHeight*CurrentRow) + …Run Code Online (Sandbox Code Playgroud) 我在片段着色器上做了一些工作,允许纹理渲染和颜色渲染.在我做了更改后,我的所有纹理都非常像素化(就像一个旧的8位游戏),我不得不提高纹理坐标的精度到中等.这也给我带来了性能影响.我只是不明白为什么我突然不得不首先改变精度.
这是"原始"着色器:
varying lowp vec2 TexCoordOut;
uniform sampler2D Texture;
uniform lowp float opacity;
void main(void) {
gl_FragColor = opacity * texture2D(Texture, TexCoordOut);
}
Run Code Online (Sandbox Code Playgroud)
这是着色器在更改后的样子:
varying mediump vec2 TexCoordOut;
uniform sampler2D Texture;
uniform lowp vec4 color;
uniform lowp float opacity;
uniform int colorRender;
void main(void) {
if (colorRender == 1)
{
gl_FragColor = color;
} else {
gl_FragColor = opacity * texture2D(Texture, TexCoordOut);
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用opengl编写一款安卓游戏.我正在使用:
colour = Color.rgb(theR,theG,theB);
Run Code Online (Sandbox Code Playgroud)
(所有整数)用于存储矩形的颜色.然后我解析出RGB来渲染矩形:
colorR = Color.red(color);
colorG = Color.green(color);
colorB = Color.blue(color);
Run Code Online (Sandbox Code Playgroud)
例如对于颜色53,130,255,这应该会产生蓝色但在我的应用程序上会产生白色.如果我使用1,1,1我会变白.如果我使用0,0,0我会变黑.如果我使用0,1,0我得到绿色等等所以它看起来像任何一个值被视为1,所以我没有得到完整的0 ... 255范围.我尝试使用Color.argb和color = Color.parseColor(theColor)颜色是一个字符串.我在一个opengles应用程序中使用它.我有一个类来显示一个颜色矩形.这绝对是正常的,因为渲染了正确的大小矩形,而不是使用大于1的值的颜色.我也使用纹理,一切都很好.有任何想法吗?太感谢了
我的代码目前正在发生一些比较奇怪的事情.我在BlackBerry Playbook上运行它,它是OpenGL ES 1.1
编辑4:我删除了我发布的所有内容以简化我的问题.
我拿了代码并将其简化为绘制两个重叠的三角形.这是包含坐标的数组以及包含颜色的数组:
GLfloat vertices[] =
{
// front
175.0f, 200.0f, -24.0f,
225.0f, 200.0f, -24.0f,
225.0f, 250.0f, -24.0f,
// back
200.0f, 200.0f, -25.0f,
250.0f, 200.0f, -25.0f,
250.0f, 250.0f, -25.0f
};
static const GLfloat colors[] =
{
/* front */ 1.0f,0.0f,0.0f,1.0f,1.0f,0.0f,0.0f,1.0f,1.0f,0.0f,0.0f,1.0f, //Red
/* back */ 0.0f,1.0f,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f,0.0f,1.0f //Green
};
Run Code Online (Sandbox Code Playgroud)
请注意,我的坐标在x方向上为0到1024,在y方向上为0到600,在z方向上为0到-10000.
这是我的设置代码,它反映了这一点:
glClearDepthf(1.0f);
glClearColor(1.0f,1.0f,1.0f,1.0f);
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glShadeModel(GL_SMOOTH);
glViewport(0, 0, surface_width, surface_height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(0, surface_width, 0, surface_height, 0, 10000);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
Run Code Online (Sandbox Code Playgroud)
我在两个地方都有深度启用,因为我试图排除在选择某种矩阵模式时应该使用它的可能性.
最后这是我的渲染代码:
void render()
{
//Typical render …Run Code Online (Sandbox Code Playgroud) 我需要一些帮助来理解视锥体转换的基础知识.主要是,深度如何运作.
以下使用768x1024的视口.使用正交投影和768x768的正方形(z默认为0),没有平移或缩放,并且glViewport(0, 0, 768, 1024)此正方形的视口可以轻松填充框架的宽度:

现在,当我将项目更改为平截头体并混淆z平移时,由于透视变化,正方形会适当缩放.
在这样的环境中,这是同一个方块:

我可以使用这个z平移,以及平截头体矩阵的近和远参数,并相应地使方形变化明显在屏幕尺寸上.精细.
但我无法弄清楚它的屏幕尺寸和这些深度参数之间的明显关系.
例如,假设我想使用平截头体但是正方形填充框架宽度,如上面的第一个示例图像中所示.怎么做到这一点?
我认为如果z平移与near平面相匹配,那么你基本上就会有一个"正好在镜头前",填充框架.但我无法想办法实现这一目标.如果我的近距离1和我的z平移是-1,那么正方形应该坐在近平面本身(右边?!),填充框架的宽度(截锥体的左右平面与正交投影相同) .
我可以在这里粘贴一堆代码来展示我正在做的事情,但我认为这里的概念很清楚.我只想弄清楚近处飞机的实际位置,如何在其上放置一些东西,因为这将有助于我理解截头体是如何工作的.
好的,这是我正在使用的相关代码,在哪里width=768和height=1024.
我的顶点着色器很简单 gl_Position=Projection*Modelview*Position;
我的投影矩阵(视锥体)因此是:
Frustum(-width/2, width/2, -height/2, height/2, 1,10);
这个功能是:
static Matrix4<T> Frustum(T left, T right, T bottom, T top, T near, T far)
{
T a = 2 * near / (right - left);
T b = 2 * near / (top - bottom);
T c = (right + left) / (right …Run Code Online (Sandbox Code Playgroud)