Unity apk/aab build gets black screen with no splash screen and shutdown then on Android

I have Unity 2020.3.17f1 version.

I’m looking for solution about three days and I still have no any idea.

I started from empty project with one sprite on scene. I tried to build it and start the one on Android and it was fine.

Next, I added png files to assets folder (it’s about 3 thousand), created only three game objects on scene and attached an animation on each one. (All my last attepts were with checked enable option to false on theese objects in inspector)

When I run project in Editor it works fine. But when I build apk or aab and start it (through unity build and run option) on Android it appears black screen (on Android device) even without splash screen and shutdown after 2-3 seconds.

I haven’t errors through the build. I have no idea even the way I should searching for solution.

PS:

  1. I have only one scene and it has been checked in build settings
  2. Compression method is LZ4HC
  3. I tried to switch off Strip Engine Code in Player settings and it didn’t help
  4. All png files has check option Override for Android and max size 512 in inspector
  5. I tried run the build on two different devices and I got the same result.
  6. I tried to remove Artifact folder

I tried to inspect logcat logs, but I hadn’t found something interesting there.

Here is the logs. I left only Warn and Error logs:

2021.10.10 13:46:53.338 12817 12817 Verbose ActivityThread Skipping new config:{1.0 ?mcc?mnc [ru_RU] ldltr sw360dp w360dp h711dp 320dpi nrml long port finger -keyb/v/h -nav/h winConfig={ mBounds=Rect(0, 0 - 0, 0) mAppBounds=Rect(0, 54 - 720, 1476) mWindowingMode=fullscreen mActivityType=undefined} nonFullScreen=0 suim:1 s.7}, config:{1.0 ?mcc?mnc [ru_RU] ldltr sw360dp w360dp h711dp 320dpi nrml long port finger -keyb/v/h -nav/h winConfig={ mBounds=Rect(0, 0 - 0, 0) mAppBounds=Rect(0, 54 - 720, 1476) mWindowingMode=fullscreen mActivityType=undefined} nonFullScreen=0 suim:1 s.7} for app:com.DefaultCompany.Test2D2122 2021.10.10 13:46:53.340 12817 12838 Error AwareLog AtomicFileUtils: readFileLines file not exist: android.util.AtomicFile@3795522 2021.10.10 13:46:53.340 12817 12830 Error MemoryLeakMonitorManager MemoryLeakMonitor.jar is not exist! 2021.10.10 13:46:53.340 12817 12838 Error AwareLog AtomicFileUtils: readFileLines file not exist: android.util.AtomicFile@ce5cbb3 2021.10.10 13:46:53.356 12817 12817 Verbose HwPolicyFactory : success to get AllImpl object and return.... 2021.10.10 13:46:53.362 12817 12817 Verbose ActivityThread callActivityOnCreate  2021.10.10 13:46:53.420 12817 12817 Verbose HwWidgetFactory : successes to get AllImpl object and return....   2021.10.10 13:46:53.438 12817 12817 Verbose AudioManager getStreamVolume  streamType: 3 volume: 1   2021.10.10 13:46:53.457 12817 12844 Warn HiTouch_HiTouchSensor depended package hiTouch does n't exist!    2021.10.10 13:46:53.510 12817 12817 Warn InputMethodManager startInputReason = 1 2021.10.10 13:46:53.526 12817 12817 Warn InputMethodManager startInputReason = 5  2021.10.10 13:46:53.543 12817 12817 Warn UnityMain type=1400 audit(0.0:56405): avc: granted { write } for name="com.DefaultCompany.Test2D2122" dev="sdcardfs" ino=46090 scontext=u:r:untrusted_app:s0:c138,c256,c512,c768 tcontext=u:object_r:sdcardfs:s0 tclass=dir 2021.10.10 13:46:53.543 12817 12817 Warn UnityMain type=1400 audit(0.0:56406): avc: granted { add_name } for name="718b47ee21adbe58cb505570c1c27231" scontext=u:r:untrusted_app:s0:c138,c256,c512,c768 tcontext=u:object_r:sdcardfs:s0 tclass=dir 2021.10.10 13:46:53.543 12817 12817 Warn UnityMain type=1400 audit(0.0:56407): avc: granted { create } for name="718b47ee21adbe58cb505570c1c27231" scontext=u:r:untrusted_app:s0:c138,c256,c512,c768 tcontext=u:object_r:sdcardfs:s0:c138,c256,c512,c768 tclass=file 2021.10.10 13:46:53.543 12817 12817 Warn UnityMain type=1400 audit(0.0:56408): avc: granted { read write open } for path="/storage/emulated/0/Android/data/com.DefaultCompany.Test2D2122/718b47ee21adbe58cb505570c1c27231" dev="sdcardfs" ino=45606 scontext=u:r:untrusted_app:s0:c138,c256,c512,c768 tcontext=u:object_r:sdcardfs:s0 tclass=file 2021.10.10 13:46:53.547 12817 12817 Warn UnityMain type=1400 audit(0.0:56409): avc: granted { write } for name="com.DefaultCompany.Test2D2122" dev="sdcardfs" ino=46090 scontext=u:r:untrusted_app:s0:c138,c256,c512,c768 tcontext=u:object_r:sdcardfs:s0 tclass=dir 2021.10.10 13:46:53.547 12817 12817 Warn UnityMain type=1400 audit(0.0:56410): avc: granted { write } for name="com.DefaultCompany.Test2D2122" dev="sdcardfs" ino=46090 scontext=u:r:untrusted_app:s0:c138,c256,c512,c768 tcontext=u:object_r:sdcardfs:s0 tclass=dir 2021.10.10 13:46:53.547 12817 12817 Warn UnityMain type=1400 audit(0.0:56411): avc: granted { remove_name } for name="718b47ee21adbe58cb505570c1c27231" dev="sdcardfs" ino=45606 scontext=u:r:untrusted_app:s0:c138,c256,c512,c768 tcontext=u:object_r:sdcardfs:s0 tclass=dir 2021.10.10 13:46:53.547 12817 12817 Warn UnityMain type=1400 audit(0.0:56412): avc: granted { rename } for name="718b47ee21adbe58cb505570c1c27231" dev="sdcardfs" ino=45606 scontext=u:r:untrusted_app:s0:c138,c256,c512,c768 tcontext=u:object_r:sdcardfs:s0 tclass=file  2021.10.10 13:46:53.766 12817 12842 Error SchedPolicy set_timerslack_ns write failed: Operation not permitted  2021.10.10 13:46:53.767 12817 12842 Error SchedPolicy set_timerslack_ns write failed: Operation not permitted  2021.10.10 13:46:53.822 12817 12842 Error GED Failed to get GED Log Buf, err(0)  2021.10.10 13:46:53.869 12817 12842 Error GED Failed to get GED Log Buf, err(0)   2021.10.10 13:46:53.930 12817 12842 Verbose AudioManager getProperty  key: android.media.property.OUTPUT_FRAMES_PER_BUFFER 2021.10.10 13:46:53.934 12817 12842 Verbose AudioManager getProperty  key: android.media.property.OUTPUT_SAMPLE_RATE 2021.10.10 13:46:53.935 12817 12842 Verbose AudioManager getProperty  key: android.media.property.OUTPUT_FRAMES_PER_BUFFER  2021.10.10 13:46:54.062 12817 12842 Verbose AudioManager getStreamVolume  streamType: 3 volume: 1  2021.10.10 13:46:58.139 12817 12817 Warn InputMethodManager startInputReason = 8 2021.10.10 13:46:58.187 12817 12817 Warn InputMethodManager startInputReason = 7 

Selecting Carbon Black for Paints, Coatings and Inks

Adding carbon black (CB) particles to elastomeric polymers is essential to the successful industrial use of rubber in many applications, and the mechanical reinforcing effect of CB in rubber has been studied for nearly 100 years. Despite these many decades of investigations, the origin of stiffness enhancement of elastomers from incorporating nanometer-scale CB particles is still debated. It is not universally accepted whether the interactions between polymer chains and CB surfaces are purely physical adsorption or whether some polymer–particle chemical bonds are also introduced in the process of mixing and curing the CB-filled rubber compounds. We review key experimental observations of rubber reinforced with CB, including the finding that heat treatment of CB can greatly reduce the filler reinforcement effect in rubber. The details of the particle morphology and surface chemistry are described to give insights into the nature of the CB–elastomer interfaces. This is followed by a discussion of rubber processing effects, the influence of CB on crosslinking, and various chemical modification approaches that have been employed to improve polymer–filler interactions and reinforcement. Finally, we contrast various models that have been proposed for rationalizing the CB reinforcement of elastomers. 

Natural rubber composite has been continuously developed due to its advantages such as a good combination of strength and damping property. Most of carbon black (CB)/Natural Rubber (NR) composite were used as material in tyre industry. The addition of CB in natural rubber is very important to enhance the strength of natural rubber. The particle loading and different structure of CB can affect the composite strength. The effects of CB particle loading of 20, 25 and 30 wt% and the effects of CB structures of N220, N330, N550 and N660 series on tensile property of composite were investigated. The result shows that the tensile strength and elastic modulus of natural rubber/CB composite was higher than pure natural rubber. From SEM observation the agglomeration of CB aggregate increases with particle loading. It leads to decrease of tensile strength of composite as more particle was added. High structure of CB particle i.e. N220 resulted in highest tensile stress. In fact, composite reinforced by N660 CB particle shown a comparable tensile strength and elastic modulus with N220 CB particle. SEM observation shows that agglomeration of CB aggregates of N330 and N550 results in lower stress of associate NR/CB composite.

Carbon black is a highly engineered form of carbon widely used in paints as paint carbon black, coatings and inks to achieve a spectrum ranging from gray to deep black. Over the time, the properties of carbon black pigment have been modified to achieve required properties in the final product, such as increased tinting strength, improved the level of jetness or blue undertone and conductivity.

Explore the different carbon black production processes and the properties to consider while selecting the right carbon black for your formulations.

Properties and End-uses of Carbon Black
Carbon black is used in many products and articles we use and see around us on a daily basis, such as: rubbers, plastics, coatings, tires, ink carbon clack.

Thus, the requirements for the carbon black are different for each application and influence the specific properties in the final application.

For the coating carbon blacks market, there is a wide range of carbon black grades available. This can make it difficult to choose the most suitable carbon black for your final application. For example, when aiming for automotive paint with a blue undertone, the carbon black of choice will have a high jetness. However, normally these types of carbon black grades are the most difficult to disperse correctly into the desired particle size.

The carbon black producers are addressing these issues by developing specialty carbon black grades that have been surface-modified and/or are pre-treated to overcome these difficulties.

How Carbon Black is Produced?
The properties of the carbon black are influenced by the method of preparation. The different processes used for channel carbon black production are discussed below.

Furnace Black Process: It is the most common method which uses (aromatic) hydrocarbon oil as the raw material. Due to its high yield and possibility to control the particle size and structure, it is most suitable for mass production of carbon black.

In the reactor the conditions (e.g. pressure and temperature) are controlled to provide a number of reactions. The most important reactions include: particle nucleation, particle growth, aggregate formation. Water injection rapidly reduces the temperature and ends the reaction. The primary particle size and structure of the carbon black is controlled by tuning the conditions in the reactor and the time allowed before the reaction is quenched.

Thermal Black Process: It is the most common method used for carbon black production after the furnace black process. It is a discontinuous or cyclical process.

This process uses natural methane gas as raw material. When the natural gas is injected into the furnace at an inert atmosphere, the gas decomposes into carbon black and hydrogen. The carbon black produced using this method has the largest particle size and the lowest degree of aggregates or structure. Due to the nature of the raw material, this carbon black is the purest form available on the industrial scale.

Channel Process: This process uses partially combusted fuel which is brought into contact with H-shaped channel steel. It is not the most used method anymore because of its:

The benefit of this process is that it provides carbon black with a lot of functional groups.

Acetylene Black Process: This process uses acetylene gas as raw material. It produces mainly high structure and higher crystallinity, making this type of carbon black suitable for electric conductive applications.

Lampblack Process: It is the oldest industrial process for making carbon black. It uses mineral/vegetable oils as its raw material.

Recovered Carbon Black from End-of-life Tires

Recovered carbon black or ®CB is a fast-expanding market. Recovered high purity carbon black is obtained through the pyrolysis process of end-of-life tires. The importance of companies in the production and use of recovered carbon black is three-fold:

The growing global problems arising with end-of-life tires (ELT)
Companies shifting strategy to fulfill the targets ensuring a green economy
Price changes of regular carbon black due to fluctuations in oil pricing

Depending on the composition, the content of carbon black in tires can be up to 30%. Next to carbon black, the tires consists:

Rubber
Rubber processing additives
Metal
Textile
Fillers such as silica

The amount of silica depends on the type of tire, for example winter or summer tire, racing tire, or tire for agricultural vehicles, and will not be separated from the carbon black during the pyrolysis process, which will result in higher ash content.

In a typical car tire, up to 15 different types of conductive carbon blacks can be used, each attributing to the different properties required. This blend of environmental carbon blacks will then also be the make-up of the final ®CB composition. Besides tires, other sources that can be used are rubber conveyor belts or other technical rubber products.

The main differences in the properties of recovered carbon black are:

The ash content is higher for ®CB caused by the fillers being used in tire production.
A blend of rubber carbon black properties as a result of the carbon black used in the tire.
Residual hydrocarbons on the carbon black surface, depending on the quality of the pyrolysis process.

To understand how the properties of ®CB influence the final applications and to know which plastic carbon black is used in which category, we need to understand the fundamental differences between the available carbon blacks.

SEO Black Hat and distribution of malware by creating pages on lots of sites targeting the name of my site

My site made with WordPress is under SEO black hat attack. They’re creating many HTML pages using my site name such as following URLs with my site title & descriptions.

  • https://aaa.example111.it/my-site-name.html
  • https://bbb.example22222222.it/my-site-name.html
  • https://ccccc.example333.it/my-site-name.html

If you click the links of Google search results, first it displays ‘checking your browser before accessing’, then redirect to the malware site zvideo-live.com. Please see the attached list (although they are in Japanese).

What’s happening is very similar to ‘Japanese keyword hack’, but the difference is my site has not hacked and they are using another domains for this. (I thoroughly checked my site and Google tools.) Actually, the users don’t have any problems as far as they click my site domain on Google search results but my site and site domain are very new and most of the search results occupy these phishy sites and it’s annoying.

I made a abuse report to Google and OVHcloud, the domain company, but the malicious pages with new domains are being added every day and it’s very hard to keep doing this.

Following are the list of the domains that hackers are using. (As far as I detect.)

acquariobeb.it areaformativaliceomiranda.it brandoleseconsulenza.it byogastudio.it calabriamediterranea.it cmtservicesrl.it computerassistancesas.it domusvenetia.it fabioviglionephotography.it flanweb.it gabriellaricciocoach.it geniusdomus.it gpad.it granfondovalledelnisi.it lamonicaservizi.it macellerialimonenicola.it onmiccatania.it orsiinchianti.it pizzapadellino-slap-torino.it retedinapoli.it ristorantelafollia.it studiobaldin.it teatrokoine.it triede20.it xtecna.it zancleartecontemporanea.it 

enter image description here

wildcards in user black list – possible?

Hello,

is it possible to use wildcards in user’s blacklist?

why ?

I want to filter out some words in domains –  like all domains with “.ru”  or “.tk” or….   (many)

there is the option to remove urls containing  ..  but i have quite a long list of strings to filter out.  it takes a lot of time to manually do it.  is there a way to automate it?  maybe through users blacklist??

thank you

Do black puddings corrode slashing weapons

Black puddings are immune to slashing damage, and the Corrosive Form trait states:

… Any nonmagical weapon made of metal or wood that hits the pudding corrodes. After dealing damage, the weapon takes a permanent and cumulative-1 penalty to damage rolls. …

The bit that confuses me is "after dealing damage". If the pudding is immune to slashing damage, then slashing weapons will never deal damage, and thus should not take the -1 penalty. However, that seems to contradict the previous statement, that anything that hits will corrode.

Mythic Black Tentacles vs. Freedom of Movement (pathfinder 1)

My group has a question about Mythic Black Tentacles vs. Freedom of Movement. For reference: https://www.d20pfsrd.com/magic/all-spells/b/black-tentacles/ https://www.d20pfsrd.com/magic/all-spells/f/freedom-of-movement/

The important parts…

From Black Tentacles:

The tentacles can grapple creatures that are immune to grappling if that immunity is from a non-mythic source, but combat maneuver checks to grapple such creatures take a –5 penalty.

Freedom of Movement, broken down apart by me:

Point 1: All combat maneuver checks made to grapple the target automatically fail.

Point 2: The subject automatically succeeds on any combat maneuver checks and Escape Artist checks made to escape a grapple or a pin.

Our current thought is that if someone has FoM up and they’re hit with Mythic Black Tentacles, they can be grappled, because the text of MBT overrides Part1 from FoM.

But then, on their turn, they can automatically escape because of Point 2 from FoM.

Does anyone else have this in play? What do you do?

Thanks in advance.

User Permisssions White List vs Black List

I have Applications, Roles, Users, Permissions, Application_Permissions, User_Permissions, Role_Permissions, Application_Roles and Role_Permissions tables. So, permission can be defined at application level, role level and user level. Let’s say User A belongs to Application X and Application X can have XX Permission. So, User A will get XX Permission. Now, I want to give all users of Application B with XX Permission but except User B. How can I fit this with my current design?

CREATE TABLE APPLICATION_PERMISIONS (APPLICATION_PERMISION_ID number(15) GENERATED AS IDENTITY, APPLICATION_ID number(15), PERMISION_DEFINITION_ID number(15)CONSTRAINT PK_SEC_APPLICATION_PERMISIONS PRIMARY KEY (APPLICATION_PERMISION_ID)); CREATE TABLE APPLICATION_ROLES (APPLICATION_ROLE_ID number(15) GENERATED AS IDENTITY, APPLICATION_ID number(15), ROLE_ID number(15)CONSTRAINT PK_SEC_APPLICATION_ROLES PRIMARY KEY (APPLICATION_ROLE_ID)); CREATE TABLE APPLICATIONS (APPLICATION_ID number(15) GENERATED AS IDENTITY, CODE varchar2(30), NAME_AR varchar2(255), NAME_EN varchar2(255), START_DATE date, END_DATE date CONSTRAINT PK_SEC_APPLICATIONS PRIMARY KEY (APPLICATION_ID)); CREATE TABLE PERMISION_DEFINITIONS (PERMISION_DEFINITION_ID number(15) GENERATED AS IDENTITY, CODE varchar2(30), NAME_AR varchar2(255), NAME_EN varchar2(255), START_DATE date, END_DATE date CONSTRAINT PK_SEC_PERMISION_DEFITIONS PRIMARY KEY (PERMISION_DEFINITION_ID)); CREATE TABLE ROLE_PERMISSIONS (ROLE_PERMISSION_ID number(15) GENERATED AS IDENTITY, ROLE_ID number(15), PERMISION_DEFINITION_ID number(15), START_DATE date, END_DATE date CONSTRAINT PK_SEC_ROLE_PERMISSIONS PRIMARY KEY (ROLE_PERMISSION_ID)); CREATE TABLE ROLES (ROLE_ID number(15) GENERATED AS IDENTITY, CODE varchar2(30) NOT NULL, NAME_AR varchar2(255), NAME_EN varchar2(255), START_DATE date, END_DATE date CONSTRAINT PK_SEC_ROLES PRIMARY KEY (ROLE_ID)); CREATE TABLE USER_PERMISSIONS (USER_PERMISSION_ID number(15) GENERATED AS IDENTITY, USER_ID number(15), PERMISION_DEFINITION_ID number(15)CONSTRAINT PK_SEC_USER_PERMISSIONS PRIMARY KEY (USER_PERMISSION_ID)); CREATE TABLE USER_ROLES (USER_ROLE_ID number(15) GENERATED AS IDENTITY, USER_ID number(15), ROLE_ID number(15)CONSTRAINT PK_SEC_USER_ROLES PRIMARY KEY (USER_ROLE_ID)); 

Get black bars with framebuffer and glViewport

I have read several tutorials and answers regarding framebuffers and glViewport, but I can’t seem to resolve this issue I have. I want to take a low resolution framebuffer (400×225) and place it in a 1280×720 window at the position 100×100 (from bottom-left);

  1. Load a 400×225 png image in a framebuffer with the same size
glGenFramebuffers(1, &m_framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer);  glGenTextures(1, &m_textureColorbuffer); glBindTexture(GL_TEXTURE_2D, m_textureColorbuffer); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 400, 225, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_textureColorbuffer, 0);  glGenRenderbuffers(1, &m_renderBuffer); glBindRenderbuffer(GL_RENDERBUFFER, m_renderBuffer); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, screenW, screenH); stencil buffer. glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, m_renderBuffer);  if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)     printf("ERROR::FRAMEBUFFER:: Framebuffer is not complete!"); glBindFramebuffer(GL_FRAMEBUFFER, 0); 
  1. Generate the quad for the framebuffer:
    float quadVertices[] = { // vertex attributes for a quad that fills the entire screen in Normalized Device Coordinates.     // positions   // texCoords     -1.0f,  1.0f,  0.0f, 1.0f,     -1.0f, -1.0f,  0.0f, 0.0f,      1.0f, -1.0f,  1.0f, 0.0f,      -1.0f,  1.0f,  0.0f, 1.0f,      1.0f, -1.0f,  1.0f, 0.0f,      1.0f,  1.0f,  1.0f, 1.0f     };      unsigned int quadVBO;     glGenVertexArrays(1, &m_quadVAO);     glGenBuffers(1, &quadVBO);     glBindVertexArray(m_quadVAO);     glBindBuffer(GL_ARRAY_BUFFER, quadVBO);     glBufferData(GL_ARRAY_BUFFER, sizeof(quadVertices), &quadVertices, GL_STATIC_DRAW);     glEnableVertexAttribArray(0);     glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0);     glEnableVertexAttribArray(1);     glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2 * sizeof(float))); 
  1. Create an orthographic projection matrix with the framebuffer size:
glm::mat4 bgProjection = glm::ortho(0.0f, static_cast<float>(400), static_cast<float>(225), 0.0f, -1.0f, 1.0f); 
  1. Set the glViewport:
glViewport(0, 0, 400, 225); 
  1. Bind the framebuffer
glBindFramebuffer(GL_FRAMEBUFFER, m_framebuffer); 
  1. Draw the sprite:
    shader->use();     glm::mat4 model = glm::mat4(1.0f);     model = glm::translate(model, glm::vec3(position, 0.0f));  // first translate (transformations are: scale happens first, then rotation, and then final translation happens; reversed order)      model = glm::translate(model, glm::vec3(0.5f * size.x, 0.5f * size.y, 0.0f)); // move origin of rotation to center of quad     model = glm::rotate(model, glm::radians(rotate), glm::vec3(0.0f, 0.0f, 1.0f)); // then rotate     model = glm::translate(model, glm::vec3(-0.5f * size.x, -0.5f * size.y, 0.0f)); // move origin back      model = glm::scale(model, glm::vec3(size, 1.0f)); // last scale      shader->setMat4("model", model);     shader->setMat4("projection", projection);      shader->setVec3("Colour", color);      glBindVertexArray(this->quadVAO);     glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);     glBindVertexArray(0); 
  1. Unbind the framebuffer:
glBindFramebuffer(GL_FRAMEBUFFER, 0); 
  1. Finally render the framebuffer:
    shader.use();     glBindVertexArray(m_quadVAO);     glBindTexture(GL_TEXTURE_2D, m_textureColorbuffer); // use the color attachment texture as the texture of the quad plane     glDrawArrays(GL_TRIANGLES, 0, 6); 

This is the output I get when glViewport(0, 0, 400, 225); enter image description here

But when I set the glViewport(100, 100, 400, 225); I get these black borders: enter image description here

As you can see, the glViewport has moved to 100×100, but it has also created a 100×100 gap in the viewport. I have tried adjusting the projection matrix and framebuffer, but it seems like I am doing something incorrect with glViewport. Thank you.