আমি ওপেনজিএল 3.3 এবং জিএলএসএল সংস্করণ 330 এর সাথে কাজ করে একটি স্কাইবক্স পাওয়ার চেষ্টা করছি।
আমি ওয়েবে কোথাও একটি সম্পূর্ণ আধুনিক ওজিএল স্কাইবক্স টিউটোরিয়ালটি খুঁজে পেলাম না, তাই আমি একটি পুরানোকে আধুনিকীকরণ করেছি ( উল্লম্বের glVertexAttribPointer()
পরিবর্তে ব্যবহার করে gl_Vertex
ইত্যাদি)। এটি বেশিরভাগ ক্ষেত্রেই কাজ করছে তবে 2 টি বড় বিবরণের জন্য:
স্কাইবক্সগুলি আরও আকাশের ত্রিভুজগুলির মতো, এবং টেক্সচারগুলি খারাপভাবে warেকে দেওয়া এবং প্রসারিত করা হয় (তারা তারকা ক্ষেত্র বলে মনে করা হয়, আমি একটি কালো পটভূমিতে রেখার সময় পেয়েছি)। আমি 99% নিশ্চিত যে এটি কারণ আমি পুরানো টিউটোরিয়ালগুলি পুরোপুরি সঠিকভাবে পোর্ট করি নি।
এখানে আমার স্কাইবক্স ক্লাস:
static ShaderProgram* cubeMapShader = nullptr;
static const GLfloat vertices[] =
{
1.0f, -1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 1.0f, -1.0f,
-1.0f, -1.0f, 1.0f,
-1.0f, -1.0f, -1.0f,
-1.0f, 1.0f, -1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f, 1.0f, -1.0f,
1.0f, 1.0f, -1.0f,
1.0f, 1.0f, 1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f, -1.0f, 1.0f,
1.0f, -1.0f, 1.0f,
1.0f, -1.0f, -1.0f,
-1.0f, -1.0f, -1.0f,
1.0f, -1.0f, 1.0f,
-1.0f, -1.0f, 1.0f,
-1.0f, 1.0f, 1.0f,
1.0f, 1.0f, 1.0f,
-1.0f, -1.0f, -1.0f,
1.0f, -1.0f, -1.0f,
1.0f, 1.0f, -1.0f,
-1.0f, 1.0f, -1.0f
};
Skybox::Skybox(const char* xp, const char* xn, const char* yp, const char* yn, const char* zp, const char* zn)
{
if (cubeMapShader == nullptr)
cubeMapShader = new ShaderProgram("cubemap.vert", "cubemap.frag");
texture = SOIL_load_OGL_cubemap(xp, xn, yp, yn, zp, zn, SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS);
glBindTexture(GL_TEXTURE_CUBE_MAP, texture);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
glGenVertexArrays(1, &vaoID);
glBindVertexArray(vaoID);
glGenBuffers(1, &vboID);
glBindBuffer(GL_ARRAY_BUFFER, vboID);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glBindVertexArray(0);
scale = 1.0f;
}
Skybox::~Skybox()
{
}
void Skybox::Render()
{
ShaderProgram::SetActive(cubeMapShader);
glDisable(GL_DEPTH_TEST);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_CUBE_MAP, texture);
cubeMapShader->Uniform1i("SkyTexture", 0);
cubeMapShader->UniformVec3("CameraPosition", Camera::ActiveCameraPosition());
cubeMapShader->UniformMat4("MVP", 1, GL_FALSE, Camera::GetActiveCamera()->GetProjectionMatrix() * Camera::GetActiveCamera()->GetViewMatrix() * glm::mat4(1.0));
glBindVertexArray(vaoID);
glDrawArrays(GL_QUADS, 0, 24);
glBindVertexArray(0);
glBindTexture(GL_TEXTURE_CUBE_MAP, 0);
}
ভার্টেক্স শ্যাডার:
#version 330
layout(location = 0) in vec3 Vertex;
uniform vec3 CameraPosition;
uniform mat4 MVP;
out vec3 Position;
void main()
{
Position = Vertex.xyz;
gl_Position = MVP * vec4(Vertex.xyz + CameraPosition, 1.0);
}
খণ্ড শ্যাডার:
#version 330 compatibility
uniform samplerCube SkyTexture;
in vec3 Position;
void main()
{
gl_FragColor = textureCube(SkyTexture, Position);
}
এখানে চটকদার উদাহরণ। কেউ যদি জিএলএসএলকে ভালভাবে জানেন (আমি এখনও এটি শিখছি) বা স্কাইবক্সগুলি দেখে নিতে পারেন তবে আপনি যে কোনও সহায়তা দিতে পারেন তা আমি প্রশংসা করব। এছাড়াও, কুডোস যদি আপনি আমাকে শিখতে পারেন কিভাবে কীভাবে খণ্ড শেডারে নন-অবহিত ফাংশনগুলি ব্যবহার করতে হয় তবে আমাকে জিএসএসএল 330 এর সামঞ্জস্যতা প্রোফাইলটি ব্যবহার করতে হবে না।
সম্পাদনা: প্রসারিত টেক্সচারগুলির সাথে সাথেই সমস্যাটি পাওয়া গেল: আমি ভার্টেক্স শ্যাডারের Position = Vertex.xy
x
পরিবর্তে ব্যবহার করছিলাম Position = Vertex.xy
z
। উফ। তবে ত্রিভুজ ত্রুটি এখনও বিদ্যমান।